AMC13
Firmwares for the different applications of the AMC13 uTCA board made at Boston University
Main Page
Design Unit List
Files
File List
All
Classes
Variables
src
common
DDR
ddr3_1_9_a
phy
mig_7series_v1_9_ddr_phy_init.v
1
//*****************************************************************************
2
// (c) Copyright 2009 - 2013 Xilinx, Inc. All rights reserved.
3
//
4
// This file contains confidential and proprietary information
5
// of Xilinx, Inc. and is protected under U.S. and
6
// international copyright and other intellectual property
7
// laws.
8
//
9
// DISCLAIMER
10
// This disclaimer is not a license and does not grant any
11
// rights to the materials distributed herewith. Except as
12
// otherwise provided in a valid license issued to you by
13
// Xilinx, and to the maximum extent permitted by applicable
14
// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
15
// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
16
// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
17
// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
18
// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
19
// (2) Xilinx shall not be liable (whether in contract or tort,
20
// including negligence, or under any other theory of
21
// liability) for any loss or damage of any kind or nature
22
// related to, arising under or in connection with these
23
// materials, including for any direct, or any indirect,
24
// special, incidental, or consequential loss or damage
25
// (including loss of data, profits, goodwill, or any type of
26
// loss or damage suffered as a result of any action brought
27
// by a third party) even if such damage or loss was
28
// reasonably foreseeable or Xilinx had been advised of the
29
// possibility of the same.
30
//
31
// CRITICAL APPLICATIONS
32
// Xilinx products are not designed or intended to be fail-
33
// safe, or for use in any application requiring fail-safe
34
// performance, such as life-support or safety devices or
35
// systems, Class III medical devices, nuclear facilities,
36
// applications related to the deployment of airbags, or any
37
// other applications that could lead to death, personal
38
// injury, or severe property or environmental damage
39
// (individually and collectively, "Critical
40
// Applications"). Customer assumes the sole risk and
41
// liability of any use of Xilinx products in Critical
42
// Applications, subject only to applicable laws and
43
// regulations governing limitations on product liability.
44
//
45
// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
46
// PART OF THIS FILE AT ALL TIMES.
47
//
48
//*****************************************************************************
49
// ____ ____
50
// / /\/ /
51
// /___/ \ / Vendor: Xilinx
52
// \ \ \/ Version: %version
53
// \ \ Application: MIG
54
// / / Filename: ddr_phy_init.v
55
// /___/ /\ Date Last Modified: $Date: 2011/06/02 08:35:09 $
56
// \ \ / \ Date Created:
57
// \___\/\___\
58
//
59
//Device: 7 Series
60
//Design Name: DDR3 SDRAM
61
//Purpose:
62
// Memory initialization and overall master state control during
63
// initialization and calibration. Specifically, the following functions
64
// are performed:
65
// 1. Memory initialization (initial AR, mode register programming, etc.)
66
// 2. Initiating write leveling
67
// 3. Generate training pattern writes for read leveling. Generate
68
// memory readback for read leveling.
69
// This module has an interface for providing control/address and write
70
// data to the PHY Control Block during initialization/calibration.
71
// Once initialization and calibration are complete, control is passed to the MC.
72
//
73
//Reference:
74
//Revision History:
75
//
76
//*****************************************************************************
77
78
/******************************************************************************
79
**$Id: ddr_phy_init.v,v 1.1 2011/06/02 08:35:09 mishra Exp $
80
**$Date: 2011/06/02 08:35:09 $
81
**$Author: mishra $
82
**$Revision: 1.1 $
83
**$Source: /devl/xcs/repo/env/Databases/ip/src2/O/mig_7series_v1_3/data/dlib/7series/ddr3_sdram/verilog/rtl/phy/ddr_phy_init.v,v $
84
*******************************************************************************/
85
86
`timescale
1ps/1ps
87
88
89
module
mig_7series_v1_9_ddr_phy_init
#
90
(
91
parameter
TCQ
=
100
,
92
parameter
nCK_PER_CLK
=
4
,
// # of memory clocks per CLK
93
parameter
CLK_PERIOD
=
3000
,
// Logic (internal) clk period (in ps)
94
parameter
USE_ODT_PORT
=
0
,
// 0 - No ODT output from FPGA
95
// 1 - ODT output from FPGA
96
parameter
PRBS_WIDTH
=
8
,
// PRBS sequence = 2^PRBS_WIDTH
97
parameter
BANK_WIDTH
=
2
,
98
parameter
CA_MIRROR
=
"OFF"
,
// C/A mirror opt for DDR3 dual rank
99
parameter
COL_WIDTH
=
10
,
100
parameter
nCS_PER_RANK
=
1
,
// # of CS bits per rank e.g. for
101
// component I/F with CS_WIDTH=1,
102
// nCS_PER_RANK=# of components
103
parameter
DQ_WIDTH
=
64
,
104
parameter
DQS_WIDTH
=
8
,
105
parameter
DQS_CNT_WIDTH
=
3
,
// = ceil(log2(DQS_WIDTH))
106
parameter
ROW_WIDTH
=
14
,
107
parameter
CS_WIDTH
=
1
,
108
parameter
RANKS
=
1
,
// # of memory ranks in the interface
109
parameter
CKE_WIDTH
=
1
,
// # of cke outputs
110
parameter
DRAM_TYPE
=
"DDR3"
,
111
parameter
REG_CTRL
=
"ON"
,
112
parameter
ADDR_CMD_MODE
=
"1T"
,
113
114
// calibration Address
115
parameter
CALIB_ROW_ADD
=
16'h0000
,
// Calibration row address
116
parameter
CALIB_COL_ADD
=
12'h000
,
// Calibration column address
117
parameter
CALIB_BA_ADD
=
3'h0
,
// Calibration bank address
118
119
// DRAM mode settings
120
parameter
AL
=
"0"
,
// Additive Latency option
121
parameter
BURST_MODE
=
"8"
,
// Burst length
122
parameter
BURST_TYPE
=
"SEQ"
,
// Burst type
123
// parameter nAL = 0, // Additive latency (in clk cyc)
124
parameter
nCL
=
5
,
// Read CAS latency (in clk cyc)
125
parameter
nCWL
=
5
,
// Write CAS latency (in clk cyc)
126
parameter
tRFC
=
110000
,
// Refresh-to-command delay (in ps)
127
parameter
OUTPUT_DRV
=
"HIGH"
,
// DRAM reduced output drive option
128
parameter
RTT_NOM
=
"60"
,
// Nominal ODT termination value
129
parameter
RTT_WR
=
"60"
,
// Write ODT termination value
130
parameter
WRLVL
=
"ON"
,
// Enable write leveling
131
// parameter PHASE_DETECT = "ON", // Enable read phase detector
132
parameter
DDR2_DQSN_ENABLE
=
"YES"
,
// Enable differential DQS for DDR2
133
parameter
nSLOTS
=
1
,
// Number of DIMM SLOTs in the system
134
parameter
SIM_INIT_OPTION
=
"NONE"
,
// "NONE", "SKIP_PU_DLY", "SKIP_INIT"
135
parameter
SIM_CAL_OPTION
=
"NONE"
,
// "NONE", "FAST_CAL", "SKIP_CAL"
136
parameter
CKE_ODT_AUX
=
"FALSE"
,
137
parameter
PRE_REV3ES
=
"OFF"
,
// Enable TG error detection during calibration
138
parameter
TEST_AL
=
"0"
// Internal use for ICM verification
139
)
140
(
141
input
clk
,
142
input
rst
,
143
input
[
2
*
8
*
nCK_PER_CLK
-
1
:
0
]
prbs_o
,
144
input
delay_incdec_done
,
145
input
ck_addr_cmd_delay_done
,
146
input
pi_phase_locked_all
,
147
input
pi_dqs_found_done
,
148
input
dqsfound_retry
,
149
input
dqs_found_prech_req
,
150
output
reg
pi_phaselock_start
,
151
output
pi_phase_locked_err
,
152
output
pi_calib_done
,
153
input
phy_if_empty
,
154
// Read/write calibration interface
155
input
wrlvl_done
,
156
input
wrlvl_rank_done
,
157
input
wrlvl_byte_done
,
158
input
wrlvl_byte_redo
,
159
input
wrlvl_final
,
160
output
reg
wrlvl_final_if_rst
,
161
input
oclkdelay_calib_done
,
162
input
oclk_prech_req
,
163
input
oclk_calib_resume
,
164
output
reg
oclkdelay_calib_start
,
165
input
done_dqs_tap_inc
,
166
input
[
5
:
0
]
rd_data_offset_0
,
167
input
[
5
:
0
]
rd_data_offset_1
,
168
input
[
5
:
0
]
rd_data_offset_2
,
169
input
[
6
*
RANKS
-
1
:
0
]
rd_data_offset_ranks_0
,
170
input
[
6
*
RANKS
-
1
:
0
]
rd_data_offset_ranks_1
,
171
input
[
6
*
RANKS
-
1
:
0
]
rd_data_offset_ranks_2
,
172
input
pi_dqs_found_rank_done
,
173
input
wrcal_done
,
174
input
wrcal_prech_req
,
175
input
wrcal_read_req
,
176
input
wrcal_act_req
,
177
input
temp_wrcal_done
,
178
input
[
7
:
0
]
slot_0_present
,
179
input
[
7
:
0
]
slot_1_present
,
180
output
reg
wl_sm_start
,
181
output
reg
wr_lvl_start
,
182
output
reg
wrcal_start
,
183
output
reg
wrcal_rd_wait
,
184
output
reg
wrcal_sanity_chk
,
185
output
reg
tg_timer_done
,
186
output
reg
no_rst_tg_mc
,
187
input
rdlvl_stg1_done
,
188
input
rdlvl_stg1_rank_done
,
189
output
reg
rdlvl_stg1_start
,
190
output
reg
pi_dqs_found_start
,
191
output
reg
detect_pi_found_dqs
,
192
// rdlvl stage 1 precharge requested after each DQS
193
input
rdlvl_prech_req
,
194
input
rdlvl_last_byte_done
,
195
input
wrcal_resume
,
196
input
wrcal_sanity_chk_done
,
197
// MPR read leveling
198
input
mpr_rdlvl_done
,
199
input
mpr_rnk_done
,
200
input
mpr_last_byte_done
,
201
output
reg
mpr_rdlvl_start
,
202
output
reg
mpr_end_if_reset
,
203
204
// PRBS Read Leveling
205
input
prbs_rdlvl_done
,
206
input
prbs_last_byte_done
,
207
input
prbs_rdlvl_prech_req
,
208
output
reg
prbs_rdlvl_start
,
209
output
reg
prbs_gen_clk_en
,
210
211
// Signals shared btw multiple calibration stages
212
output
reg
prech_done
,
213
// Data select / status
214
output
reg
init_calib_complete
,
215
// Signal to mask memory model error for Invalid latching edge
216
output
reg
calib_writes
,
217
// PHY address/control
218
// 2 commands to PHY Control Block per div 2 clock in 2:1 mode
219
// 4 commands to PHY Control Block per div 4 clock in 4:1 mode
220
output
reg
[
nCK_PER_CLK
*
ROW_WIDTH
-
1
:
0
]
phy_address
,
221
output
reg
[
nCK_PER_CLK
*
BANK_WIDTH
-
1
:
0
]
phy_bank
,
222
output
reg
[
nCK_PER_CLK
-
1
:
0
]
phy_ras_n
,
223
output
reg
[
nCK_PER_CLK
-
1
:
0
]
phy_cas_n
,
224
output
reg
[
nCK_PER_CLK
-
1
:
0
]
phy_we_n
,
225
output
reg
phy_reset_n
,
226
output
[
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
-
1
:
0
]
phy_cs_n
,
227
228
// Hard PHY Interface signals
229
input
phy_ctl_ready
,
230
input
phy_ctl_full
,
231
input
phy_cmd_full
,
232
input
phy_data_full
,
233
output
reg
calib_ctl_wren
,
234
output
reg
calib_cmd_wren
,
235
output
reg
[
1
:
0
]
calib_seq
,
236
output
reg
write_calib
,
237
output
reg
read_calib
,
238
// PHY_Ctl_Wd
239
output
reg
[
2
:
0
]
calib_cmd
,
240
// calib_aux_out used for CKE and ODT
241
output
reg
[
3
:
0
]
calib_aux_out
,
242
output
reg
[
1
:
0
]
calib_odt
,
243
output
reg
[
nCK_PER_CLK
-
1
:
0
]
calib_cke
,
244
output
[
1
:
0
]
calib_rank_cnt
,
245
output
reg
[
1
:
0
]
calib_cas_slot
,
246
output
reg
[
5
:
0
]
calib_data_offset_0
,
247
output
reg
[
5
:
0
]
calib_data_offset_1
,
248
output
reg
[
5
:
0
]
calib_data_offset_2
,
249
// PHY OUT_FIFO
250
output
reg
calib_wrdata_en
,
251
output
reg
[
2
*
nCK_PER_CLK
*
DQ_WIDTH
-
1
:
0
]
phy_wrdata
,
252
// PHY Read
253
output
phy_rddata_en
,
254
output
phy_rddata_valid
,
255
output
[
255
:
0
]
dbg_phy_init
256
);
257
258
//*****************************************************************************
259
// Assertions to be added
260
//*****************************************************************************
261
// The phy_ctl_full signal must never be asserted in synchronous mode of
262
// operation either 4:1 or 2:1
263
//
264
// The RANKS parameter must never be set to '0' by the user
265
// valid values: 1 to 4
266
//
267
//*****************************************************************************
268
269
//***************************************************************************
270
271
// Number of Read level stage 1 writes limited to a SDRAM row
272
// The address of Read Level stage 1 reads must also be limited
273
// to a single SDRAM row
274
// (2^COL_WIDTH)/BURST_MODE = (2^10)/8 = 128
275
localparam
NUM_STG1_WR_RD
= (
BURST_MODE
==
"8"
) ?
4
:
276
(
BURST_MODE
==
"4"
) ?
8
:
4
;
277
278
279
localparam
ADDR_INC
= (
BURST_MODE
==
"8"
) ?
8
:
280
(
BURST_MODE
==
"4"
) ?
4
:
8
;
281
282
// In a 2 slot dual rank per system RTT_NOM values
283
// for Rank2 and Rank3 default to 40 ohms
284
localparam
RTT_NOM2
=
"40"
;
285
localparam
RTT_NOM3
=
"40"
;
286
287
localparam
RTT_NOM_int
= (
USE_ODT_PORT
==
1
) ?
RTT_NOM
:
RTT_WR
;
288
289
// Specifically for use with half-frequency controller (nCK_PER_CLK=2)
290
// = 1 if burst length = 4, = 0 if burst length = 8. Determines how
291
// often row command needs to be issued during read-leveling
292
// For DDR3 the burst length is fixed during calibration
293
localparam
BURST4_FLAG
= (
DRAM_TYPE
==
"DDR3"
)?
1'b0
:
294
(
BURST_MODE
==
"8"
) ?
1'b0
:
295
((
BURST_MODE
==
"4"
) ?
1'b1
:
1'b0
);
296
297
298
299
300
//***************************************************************************
301
// Counter values used to determine bus timing
302
// NOTE on all counter terminal counts - these can/should be one less than
303
// the actual delay to take into account extra clock cycle delay in
304
// generating the corresponding "done" signal
305
//***************************************************************************
306
307
localparam
CLK_MEM_PERIOD
=
CLK_PERIOD
/
nCK_PER_CLK
;
308
309
// Calculate initial delay required in number of CLK clock cycles
310
// to delay initially. The counter is clocked by [CLK/1024] - which
311
// is approximately division by 1000 - note that the formulas below will
312
// result in more than the minimum wait time because of this approximation.
313
// NOTE: For DDR3 JEDEC specifies to delay reset
314
// by 200us, and CKE by an additional 500us after power-up
315
// For DDR2 CKE is delayed by 200us after power up.
316
localparam
DDR3_RESET_DELAY_NS
=
200000
;
317
localparam
DDR3_CKE_DELAY_NS
=
500000
+
DDR3_RESET_DELAY_NS
;
318
localparam
DDR2_CKE_DELAY_NS
=
200000
;
319
localparam
PWRON_RESET_DELAY_CNT
=
320
((
DDR3_RESET_DELAY_NS
+
CLK_PERIOD
-
1
)/
CLK_PERIOD
);
321
localparam
PWRON_CKE_DELAY_CNT
= (
DRAM_TYPE
==
"DDR3"
) ?
322
(((
DDR3_CKE_DELAY_NS
+
CLK_PERIOD
-
1
)/
CLK_PERIOD
)) :
323
(((
DDR2_CKE_DELAY_NS
+
CLK_PERIOD
-
1
)/
CLK_PERIOD
));
324
// FOR DDR2 -1 taken out. With -1 not getting 200us. The equation
325
// needs to be reworked.
326
localparam
DDR2_INIT_PRE_DELAY_PS
=
400000
;
327
localparam
DDR2_INIT_PRE_CNT
=
328
((
DDR2_INIT_PRE_DELAY_PS
+
CLK_PERIOD
-
1
)/
CLK_PERIOD
)-
1
;
329
330
// Calculate tXPR time: reset from CKE HIGH to valid command after power-up
331
// tXPR = (max(5nCK, tRFC(min)+10ns). Add a few (blah, messy) more clock
332
// cycles because this counter actually starts up before CKE is asserted
333
// to memory.
334
localparam
TXPR_DELAY_CNT
=
335
(
5
*
CLK_MEM_PERIOD
>
tRFC
+
10000
) ?
336
(((
5
+
nCK_PER_CLK
-
1
)/
nCK_PER_CLK
)-
1
)+
11
:
337
(((
tRFC
+
10000
+
CLK_PERIOD
-
1
)/
CLK_PERIOD
)-
1
)+
11
;
338
339
// tDLLK/tZQINIT time = 512*tCK = 256*tCLKDIV
340
localparam
TDLLK_TZQINIT_DELAY_CNT
=
255
;
341
342
// TWR values in ns. Both DDR2 and DDR3 have the same value.
343
// 15000ns/tCK
344
localparam
TWR_CYC
= ((
15000
) %
CLK_MEM_PERIOD
) ?
345
(
15000
/
CLK_MEM_PERIOD
) +
1
:
15000
/
CLK_MEM_PERIOD
;
346
347
// time to wait between consecutive commands in PHY_INIT - this is a
348
// generic number, and must be large enough to account for worst case
349
// timing parameter (tRFC - refresh-to-active) across all memory speed
350
// grades and operating frequencies. Expressed in clk
351
// (Divided by 4 or Divided by 2) clock cycles.
352
localparam
CNTNEXT_CMD
=
7'b1111111
;
353
354
// Counter values to keep track of which MR register to load during init
355
// Set value of INIT_CNT_MR_DONE to equal value of counter for last mode
356
// register configured during initialization.
357
// NOTE: Reserve more bits for DDR2 - more MR accesses for DDR2 init
358
localparam
INIT_CNT_MR2
=
2'b00
;
359
localparam
INIT_CNT_MR3
=
2'b01
;
360
localparam
INIT_CNT_MR1
=
2'b10
;
361
localparam
INIT_CNT_MR0
=
2'b11
;
362
localparam
INIT_CNT_MR_DONE
=
2'b11
;
363
364
// Register chip programmable values for DDR3
365
// The register chip for the registered DIMM needs to be programmed
366
// before the initialization of the registered DIMM.
367
// Address for the control word is in : DBA2, DA2, DA1, DA0
368
// Data for the control word is in: DBA1 DBA0, DA4, DA3
369
// The values will be stored in the local param in the following format
370
// {DBA[2:0], DA[4:0]}
371
372
// RC0 is global features control word. Address == 000
373
374
localparam
REG_RC0
=
8'b00000000
;
375
376
// RC1 Clock driver enable control word. Enables or disables the four
377
// output clocks in the register chip. For single rank and dual rank
378
// two clocks will be enabled and for quad rank all the four clocks
379
// will be enabled. Address == 000. Data = 0110 for single and dual rank.
380
// = 0000 for quad rank
381
localparam
REG_RC1
= (
RANKS
<=
2
) ?
8'b00110001
:
8'b00000001
;
382
383
// RC2 timing control word. Set in 1T timing mode
384
// Address = 010. Data = 0000
385
localparam
REG_RC2
=
8'b00000010
;
386
387
// RC3 timing control word. Setting the data to 0000
388
localparam
REG_RC3
=
8'b00000011
;
389
390
// RC4 timing control work. Setting the data to 0000
391
localparam
REG_RC4
=
8'b00000100
;
392
393
// RC5 timing control work. Setting the data to 0000
394
localparam
REG_RC5
=
8'b00000101
;
395
396
// For non-zero AL values
397
localparam
nAL
= (
AL
==
"CL-1"
) ?
nCL
-
1
:
0
;
398
399
// Adding the register dimm latency to write latency
400
localparam
CWL_M
= (
REG_CTRL
==
"ON"
) ?
nCWL
+
nAL
+
1
:
nCWL
+
nAL
;
401
402
// Count value to generate pi_phase_locked_err signal
403
localparam
PHASELOCKED_TIMEOUT
= (
SIM_CAL_OPTION
==
"NONE"
) ?
16383
:
1000
;
404
405
// Timeout interval for detecting error with Traffic Generator
406
localparam
[
13
:
0
]
TG_TIMER_TIMEOUT
407
= (
SIM_CAL_OPTION
==
"NONE"
) ?
14'h3FFF
:
14'h0001
;
408
409
// Master state machine encoding
410
localparam
INIT_IDLE
=
6'b000000
;
//0
411
localparam
INIT_WAIT_CKE_EXIT
=
6'b000001
;
//1
412
localparam
INIT_LOAD_MR
=
6'b000010
;
//2
413
localparam
INIT_LOAD_MR_WAIT
=
6'b000011
;
//3
414
localparam
INIT_ZQCL
=
6'b000100
;
//4
415
localparam
INIT_WAIT_DLLK_ZQINIT
=
6'b000101
;
//5
416
localparam
INIT_WRLVL_START
=
6'b000110
;
//6
417
localparam
INIT_WRLVL_WAIT
=
6'b000111
;
//7
418
localparam
INIT_WRLVL_LOAD_MR
=
6'b001000
;
//8
419
localparam
INIT_WRLVL_LOAD_MR_WAIT
=
6'b001001
;
//9
420
localparam
INIT_WRLVL_LOAD_MR2
=
6'b001010
;
//A
421
localparam
INIT_WRLVL_LOAD_MR2_WAIT
=
6'b001011
;
//B
422
localparam
INIT_RDLVL_ACT
=
6'b001100
;
//C
423
localparam
INIT_RDLVL_ACT_WAIT
=
6'b001101
;
//D
424
localparam
INIT_RDLVL_STG1_WRITE
=
6'b001110
;
//E
425
localparam
INIT_RDLVL_STG1_WRITE_READ
=
6'b001111
;
//F
426
localparam
INIT_RDLVL_STG1_READ
=
6'b010000
;
//10
427
localparam
INIT_RDLVL_STG2_READ
=
6'b010001
;
//11
428
localparam
INIT_RDLVL_STG2_READ_WAIT
=
6'b010010
;
//12
429
localparam
INIT_PRECHARGE_PREWAIT
=
6'b010011
;
//13
430
localparam
INIT_PRECHARGE
=
6'b010100
;
//14
431
localparam
INIT_PRECHARGE_WAIT
=
6'b010101
;
//15
432
localparam
INIT_DONE
=
6'b010110
;
//16
433
localparam
INIT_DDR2_PRECHARGE
=
6'b010111
;
//17
434
localparam
INIT_DDR2_PRECHARGE_WAIT
=
6'b011000
;
//18
435
localparam
INIT_REFRESH
=
6'b011001
;
//19
436
localparam
INIT_REFRESH_WAIT
=
6'b011010
;
//1A
437
localparam
INIT_REG_WRITE
=
6'b011011
;
//1B
438
localparam
INIT_REG_WRITE_WAIT
=
6'b011100
;
//1C
439
localparam
INIT_DDR2_MULTI_RANK
=
6'b011101
;
//1D
440
localparam
INIT_DDR2_MULTI_RANK_WAIT
=
6'b011110
;
//1E
441
localparam
INIT_WRCAL_ACT
=
6'b011111
;
//1F
442
localparam
INIT_WRCAL_ACT_WAIT
=
6'b100000
;
//20
443
localparam
INIT_WRCAL_WRITE
=
6'b100001
;
//21
444
localparam
INIT_WRCAL_WRITE_READ
=
6'b100010
;
//22
445
localparam
INIT_WRCAL_READ
=
6'b100011
;
//23
446
localparam
INIT_WRCAL_READ_WAIT
=
6'b100100
;
//24
447
localparam
INIT_WRCAL_MULT_READS
=
6'b100101
;
//25
448
localparam
INIT_PI_PHASELOCK_READS
=
6'b100110
;
//26
449
localparam
INIT_MPR_RDEN
=
6'b100111
;
//27
450
localparam
INIT_MPR_WAIT
=
6'b101000
;
//28
451
localparam
INIT_MPR_READ
=
6'b101001
;
//29
452
localparam
INIT_MPR_DISABLE_PREWAIT
=
6'b101010
;
//2A
453
localparam
INIT_MPR_DISABLE
=
6'b101011
;
//2B
454
localparam
INIT_MPR_DISABLE_WAIT
=
6'b101100
;
//2C
455
localparam
INIT_OCLKDELAY_ACT
=
6'b101101
;
//2D
456
localparam
INIT_OCLKDELAY_ACT_WAIT
=
6'b101110
;
//2E
457
localparam
INIT_OCLKDELAY_WRITE
=
6'b101111
;
//2F
458
localparam
INIT_OCLKDELAY_WRITE_WAIT
=
6'b110000
;
//30
459
localparam
INIT_OCLKDELAY_READ
=
6'b110001
;
//31
460
localparam
INIT_OCLKDELAY_READ_WAIT
=
6'b110010
;
//32
461
localparam
INIT_REFRESH_RNK2_WAIT
=
6'b110011
;
//33
462
463
integer
i
,
j
,
k
,
l
,
m
,
n
,
p
,
q
;
464
465
reg
pi_dqs_found_all_r
;
466
(*
ASYNC_REG
=
"TRUE"
*)
reg
pi_phase_locked_all_r1
;
467
(*
ASYNC_REG
=
"TRUE"
*)
reg
pi_phase_locked_all_r2
;
468
(*
ASYNC_REG
=
"TRUE"
*)
reg
pi_phase_locked_all_r3
;
469
(*
ASYNC_REG
=
"TRUE"
*)
reg
pi_phase_locked_all_r4
;
470
reg
pi_calib_rank_done_r
;
471
reg
[
13
:
0
]
pi_phaselock_timer
;
472
reg
stg1_wr_done
;
473
reg
rnk_ref_cnt
;
474
reg
pi_dqs_found_done_r1
;
475
reg
pi_dqs_found_rank_done_r
;
476
reg
read_calib_int
;
477
reg
read_calib_r
;
478
reg
pi_calib_done_r
;
479
reg
pi_calib_done_r1
;
480
reg
burst_addr_r
;
481
reg
[
1
:
0
]
chip_cnt_r
;
482
reg
[
6
:
0
]
cnt_cmd_r
;
483
reg
cnt_cmd_done_r
;
484
reg
cnt_cmd_done_m7_r
;
485
reg
[
7
:
0
]
cnt_dllk_zqinit_r
;
486
reg
cnt_dllk_zqinit_done_r
;
487
reg
cnt_init_af_done_r
;
488
reg
[
1
:
0
]
cnt_init_af_r
;
489
reg
[
1
:
0
]
cnt_init_data_r
;
490
reg
[
1
:
0
]
cnt_init_mr_r
;
491
reg
cnt_init_mr_done_r
;
492
reg
cnt_init_pre_wait_done_r
;
493
reg
[
7
:
0
]
cnt_init_pre_wait_r
;
494
reg
[
9
:
0
]
cnt_pwron_ce_r
;
495
reg
cnt_pwron_cke_done_r
;
496
reg
cnt_pwron_cke_done_r1
;
497
reg
[
8
:
0
]
cnt_pwron_r
;
498
reg
cnt_pwron_reset_done_r
;
499
reg
cnt_txpr_done_r
;
500
reg
[
7
:
0
]
cnt_txpr_r
;
501
reg
ddr2_pre_flag_r
;
502
reg
ddr2_refresh_flag_r
;
503
reg
ddr3_lm_done_r
;
504
reg
[
4
:
0
]
enable_wrlvl_cnt
;
505
reg
init_complete_r
;
506
reg
init_complete_r1
;
507
reg
init_complete_r2
;
508
(*
keep
=
"true"
*)
reg
init_complete_r_timing
;
509
(*
keep
=
"true"
*)
reg
init_complete_r1_timing
;
510
reg
[
5
:
0
]
init_next_state
;
511
reg
[
5
:
0
]
init_state_r
;
512
reg
[
5
:
0
]
init_state_r1
;
513
wire
[
15
:
0
]
load_mr0
;
514
wire
[
15
:
0
]
load_mr1
;
515
wire
[
15
:
0
]
load_mr2
;
516
wire
[
15
:
0
]
load_mr3
;
517
reg
mem_init_done_r
;
518
reg
[
1
:
0
]
mr2_r
[
0
:
3
];
519
reg
[
2
:
0
]
mr1_r
[
0
:
3
];
520
reg
new_burst_r
;
521
reg
[
15
:
0
]
wrcal_start_dly_r
;
522
wire
wrcal_start_pre
;
523
reg
wrcal_resume_r
;
524
// Only one ODT signal per rank in PHY Control Block
525
reg
[
nCK_PER_CLK
-
1
:
0
]
phy_tmp_odt_r
;
526
reg
[
nCK_PER_CLK
-
1
:
0
]
phy_tmp_odt_r1
;
527
528
reg
[
CS_WIDTH
*
nCS_PER_RANK
-
1
:
0
]
phy_tmp_cs1_r
;
529
reg
[
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
-
1
:
0
]
phy_int_cs_n
;
530
wire
prech_done_pre
;
531
reg
[
15
:
0
]
prech_done_dly_r
;
532
reg
prech_pending_r
;
533
reg
prech_req_posedge_r
;
534
reg
prech_req_r
;
535
reg
pwron_ce_r
;
536
reg
first_rdlvl_pat_r
;
537
reg
first_wrcal_pat_r
;
538
reg
phy_wrdata_en
;
539
reg
phy_wrdata_en_r1
;
540
reg
[
1
:
0
]
wrdata_pat_cnt
;
541
reg
[
1
:
0
]
wrcal_pat_cnt
;
542
reg
[
ROW_WIDTH
-
1
:
0
]
address_w
;
543
reg
[
BANK_WIDTH
-
1
:
0
]
bank_w
;
544
reg
rdlvl_stg1_done_r1
;
545
reg
rdlvl_stg1_start_int
;
546
reg
[
15
:
0
]
rdlvl_start_dly0_r
;
547
reg
rdlvl_start_pre
;
548
reg
rdlvl_last_byte_done_r
;
549
wire
rdlvl_rd
;
550
wire
rdlvl_wr
;
551
reg
rdlvl_wr_r
;
552
wire
rdlvl_wr_rd
;
553
reg
[
2
:
0
]
reg_ctrl_cnt_r
;
554
reg
[
1
:
0
]
tmp_mr2_r
[
0
:
3
];
555
reg
[
2
:
0
]
tmp_mr1_r
[
0
:
3
];
556
reg
wrlvl_done_r
;
557
reg
wrlvl_done_r1
;
558
reg
wrlvl_rank_done_r1
;
559
reg
wrlvl_rank_done_r2
;
560
reg
wrlvl_rank_done_r3
;
561
reg
wrlvl_rank_done_r4
;
562
reg
wrlvl_rank_done_r5
;
563
reg
wrlvl_rank_done_r6
;
564
reg
wrlvl_rank_done_r7
;
565
reg
[
2
:
0
]
wrlvl_rank_cntr
;
566
reg
wrlvl_odt_ctl
;
567
reg
wrlvl_odt
;
568
reg
wrlvl_active
;
569
reg
wrlvl_active_r1
;
570
reg
[
2
:
0
]
num_reads
;
571
reg
temp_wrcal_done_r
;
572
reg
temp_lmr_done
;
573
reg
extend_cal_pat
;
574
reg
[
13
:
0
]
tg_timer
;
575
reg
tg_timer_go
;
576
reg
cnt_wrcal_rd
;
577
reg
[
3
:
0
]
cnt_wait
;
578
reg
[
7
:
0
]
wrcal_reads
;
579
reg
[
8
:
0
]
stg1_wr_rd_cnt
;
580
reg
phy_data_full_r
;
581
reg
wr_level_dqs_asrt
;
582
reg
wr_level_dqs_asrt_r1
;
583
reg
[
1
:
0
]
dqs_asrt_cnt
;
584
585
586
reg
[
3
:
0
]
num_refresh
;
587
wire
oclkdelay_calib_start_pre
;
588
reg
[
15
:
0
]
oclkdelay_start_dly_r
;
589
reg
[
3
:
0
]
oclk_wr_cnt
;
590
reg
[
3
:
0
]
wrcal_wr_cnt
;
591
reg
wrlvl_final_r
;
592
593
594
reg
prbs_rdlvl_done_r1
;
595
reg
prbs_last_byte_done_r
;
596
reg
phy_if_empty_r
;
597
598
reg
wrcal_final_chk
;
599
//***************************************************************************
600
// Debug
601
//***************************************************************************
602
603
//synthesis translate_off
604
always
@(
posedge
mem_init_done_r
)
begin
605
if
(!
rst
)
606
$display
(
"PHY_INIT: Memory Initialization completed at %t"
,
$time
);
607
end
608
609
always
@(
posedge
wrlvl_done
)
begin
610
if
(!
rst
&& (
WRLVL
==
"ON"
))
611
$display
(
"PHY_INIT: Write Leveling completed at %t"
,
$time
);
612
end
613
614
always
@(
posedge
rdlvl_stg1_done
)
begin
615
if
(!
rst
)
616
$display
(
"PHY_INIT: Read Leveling Stage 1 completed at %t"
,
$time
);
617
end
618
619
always
@(
posedge
mpr_rdlvl_done
)
begin
620
if
(!
rst
)
621
$display
(
"PHY_INIT: MPR Read Leveling completed at %t"
,
$time
);
622
end
623
624
always
@(
posedge
oclkdelay_calib_done
)
begin
625
if
(!
rst
)
626
$display
(
"PHY_INIT: OCLKDELAY calibration completed at %t"
,
$time
);
627
end
628
629
always
@(
posedge
pi_calib_done_r1
)
begin
630
if
(!
rst
)
631
$display
(
"PHY_INIT: Phaser_In Phase Locked at %t"
,
$time
);
632
end
633
634
always
@(
posedge
pi_dqs_found_done
)
begin
635
if
(!
rst
)
636
$display
(
"PHY_INIT: Phaser_In DQSFOUND completed at %t"
,
$time
);
637
end
638
639
always
@(
posedge
wrcal_done
)
begin
640
if
(!
rst
&& (
WRLVL
==
"ON"
))
641
$display
(
"PHY_INIT: Write Calibration completed at %t"
,
$time
);
642
end
643
644
//synthesis translate_on
645
646
assign
dbg_phy_init
[
5
:
0
] =
init_state_r
;
647
//***************************************************************************
648
// DQS count to be sent to hard PHY during Phaser_IN Phase Locking stage
649
//***************************************************************************
650
651
// assign pi_phaselock_calib_cnt = dqs_cnt_r;
652
653
assign
pi_calib_done
=
pi_calib_done_r1
;
654
655
always
@(
posedge
clk
)
begin
656
if
(
rst
)
657
wrcal_final_chk
<= #TCQ
1'b0
;
658
else
if
((
init_next_state
==
INIT_WRCAL_ACT
) &&
wrcal_done
&&
659
(
DRAM_TYPE
==
"DDR3"
))
660
wrcal_final_chk
<= #TCQ
1'b1
;
661
end
662
663
always
@(
posedge
clk
)
begin
664
rdlvl_stg1_done_r1
<= #TCQ
rdlvl_stg1_done
;
665
prbs_rdlvl_done_r1
<= #TCQ
prbs_rdlvl_done
;
666
wrcal_resume_r
<= #TCQ
wrcal_resume
;
667
wrcal_sanity_chk
<= #TCQ
wrcal_final_chk
;
668
end
669
670
always
@(
posedge
clk
)
begin
671
if
(
rst
)
672
mpr_end_if_reset
<= #TCQ
1'b0
;
673
else
if
(
mpr_last_byte_done
&& (
num_refresh
!=
'd0
))
674
mpr_end_if_reset
<= #TCQ
1'b1
;
675
else
676
mpr_end_if_reset
<= #TCQ
1'b0
;
677
end
678
679
// Siganl to mask memory model error for Invalid latching edge
680
681
always
@(
posedge
clk
)
682
if
(
rst
)
683
calib_writes
<= #TCQ
1'b0
;
684
else
if
((
init_state_r
==
INIT_OCLKDELAY_WRITE
) ||
685
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
686
(
init_state_r
==
INIT_RDLVL_STG1_WRITE_READ
) ||
687
(
init_state_r
==
INIT_WRCAL_WRITE
) ||
688
(
init_state_r
==
INIT_WRCAL_WRITE_READ
))
689
calib_writes
<= #TCQ
1'b1
;
690
else
691
calib_writes
<= #TCQ
1'b0
;
692
693
always
@(
posedge
clk
)
694
if
(
rst
)
695
wrcal_rd_wait
<= #TCQ
1'b0
;
696
else
if
(
init_state_r
==
INIT_WRCAL_READ_WAIT
)
697
wrcal_rd_wait
<= #TCQ
1'b1
;
698
else
699
wrcal_rd_wait
<= #TCQ
1'b0
;
700
701
//***************************************************************************
702
// Signal PHY completion when calibration is finished
703
// Signal assertion is delayed by four clock cycles to account for the
704
// multi cycle path constraint to (phy_init_data_sel) signal.
705
//***************************************************************************
706
707
always
@(
posedge
clk
)
708
if
(
rst
)
begin
709
init_complete_r
<= #TCQ
1'b0
;
710
init_complete_r_timing
<= #TCQ
1'b0
;
711
init_complete_r1
<= #TCQ
1'b0
;
712
init_complete_r1_timing
<= #TCQ
1'b0
;
713
init_complete_r2
<= #TCQ
1'b0
;
714
init_calib_complete
<= #TCQ
1'b0
;
715
end
else
begin
716
if
(
init_state_r
==
INIT_DONE
)
begin
717
init_complete_r
<= #TCQ
1'b1
;
718
init_complete_r_timing
<= #TCQ
1'b1
;
719
end
720
init_complete_r1
<= #TCQ
init_complete_r
;
721
init_complete_r1_timing
<= #TCQ
init_complete_r_timing
;
722
init_complete_r2
<= #TCQ
init_complete_r1
;
723
init_calib_complete
<= #TCQ
init_complete_r2
;
724
end
725
726
//***************************************************************************
727
// Instantiate FF for the phy_init_data_sel signal. A multi cycle path
728
// constraint will be assigned to this signal. This signal will only be
729
// used within the PHY
730
//***************************************************************************
731
732
// FDRSE u_ff_phy_init_data_sel
733
// (
734
// .Q (phy_init_data_sel),
735
// .C (clk),
736
// .CE (1'b1),
737
// .D (init_complete_r),
738
// .R (1'b0),
739
// .S (1'b0)
740
// ) /* synthesis syn_preserve=1 */
741
// /* synthesis syn_replicate = 0 */;
742
743
744
//***************************************************************************
745
// Mode register programming
746
//***************************************************************************
747
748
//*****************************************************************
749
// DDR3 Load mode reg0
750
// Mode Register (MR0):
751
// [15:13] - unused - 000
752
// [12] - Precharge Power-down DLL usage - 0 (DLL frozen, slow-exit),
753
// 1 (DLL maintained)
754
// [11:9] - write recovery for Auto Precharge (tWR/tCK = 6)
755
// [8] - DLL reset - 0 or 1
756
// [7] - Test Mode - 0 (normal)
757
// [6:4],[2] - CAS latency - CAS_LAT
758
// [3] - Burst Type - BURST_TYPE
759
// [1:0] - Burst Length - BURST_LEN
760
// DDR2 Load mode register
761
// Mode Register (MR):
762
// [15:14] - unused - 00
763
// [13] - reserved - 0
764
// [12] - Power-down mode - 0 (normal)
765
// [11:9] - write recovery - write recovery for Auto Precharge
766
// (tWR/tCK = 6)
767
// [8] - DLL reset - 0 or 1
768
// [7] - Test Mode - 0 (normal)
769
// [6:4] - CAS latency - CAS_LAT
770
// [3] - Burst Type - BURST_TYPE
771
// [2:0] - Burst Length - BURST_LEN
772
773
//*****************************************************************
774
generate
775
if
(
DRAM_TYPE
==
"DDR3"
)
begin
:
gen_load_mr0_DDR3
776
assign
load_mr0
[
1
:
0
] = (
BURST_MODE
==
"8"
) ?
2'b00
:
777
(
BURST_MODE
==
"OTF"
) ?
2'b01
:
778
(
BURST_MODE
==
"4"
) ?
2'b10
:
2'b11
;
779
assign
load_mr0
[
2
] = (
nCL
>=
12
) ?
1'b1
:
1'b0
;
// LSb of CAS latency
780
assign
load_mr0
[
3
] = (
BURST_TYPE
==
"SEQ"
) ?
1'b0
:
1'b1
;
781
assign
load_mr0
[
6
:
4
] = ((
nCL
==
5
) || (
nCL
==
13
)) ?
3'b001
:
782
((
nCL
==
6
) || (
nCL
==
14
)) ?
3'b010
:
783
(
nCL
==
7
) ?
3'b011
:
784
(
nCL
==
8
) ?
3'b100
:
785
(
nCL
==
9
) ?
3'b101
:
786
(
nCL
==
10
) ?
3'b110
:
787
(
nCL
==
11
) ?
3'b111
:
788
(
nCL
==
12
) ?
3'b000
:
3'b111
;
789
assign
load_mr0
[
7
] =
1'b0
;
790
assign
load_mr0
[
8
] =
1'b1
;
// Reset DLL (init only)
791
assign
load_mr0
[
11
:
9
] = (
TWR_CYC
==
5
) ?
3'b001
:
792
(
TWR_CYC
==
6
) ?
3'b010
:
793
(
TWR_CYC
==
7
) ?
3'b011
:
794
(
TWR_CYC
==
8
) ?
3'b100
:
795
(
TWR_CYC
==
9
) ?
3'b101
:
796
(
TWR_CYC
==
10
) ?
3'b101
:
797
(
TWR_CYC
==
11
) ?
3'b110
:
798
(
TWR_CYC
==
12
) ?
3'b110
:
799
(
TWR_CYC
==
13
) ?
3'b111
:
800
(
TWR_CYC
==
14
) ?
3'b111
:
801
(
TWR_CYC
==
15
) ?
3'b000
:
802
(
TWR_CYC
==
16
) ?
3'b000
:
3'b010
;
803
assign
load_mr0
[
12
] =
1'b0
;
// Precharge Power-Down DLL 'slow-exit'
804
assign
load_mr0
[
15
:
13
] =
3'b000
;
805
end
else
if
(
DRAM_TYPE
==
"DDR2"
)
begin
:
gen_load_mr0_DDR2
// block: gen
806
assign
load_mr0
[
2
:
0
] = (
BURST_MODE
==
"8"
) ?
3'b011
:
807
(
BURST_MODE
==
"4"
) ?
3'b010
:
3'b111
;
808
assign
load_mr0
[
3
] = (
BURST_TYPE
==
"SEQ"
) ?
1'b0
:
1'b1
;
809
assign
load_mr0
[
6
:
4
] = (
nCL
==
3
) ?
3'b011
:
810
(
nCL
==
4
) ?
3'b100
:
811
(
nCL
==
5
) ?
3'b101
:
812
(
nCL
==
6
) ?
3'b110
:
3'b111
;
813
assign
load_mr0
[
7
] =
1'b0
;
814
assign
load_mr0
[
8
] =
1'b1
;
// Reset DLL (init only)
815
assign
load_mr0
[
11
:
9
] = (
TWR_CYC
==
2
) ?
3'b001
:
816
(
TWR_CYC
==
3
) ?
3'b010
:
817
(
TWR_CYC
==
4
) ?
3'b011
:
818
(
TWR_CYC
==
5
) ?
3'b100
:
819
(
TWR_CYC
==
6
) ?
3'b101
:
3'b010
;
820
assign
load_mr0
[
15
:
12
]=
4'b0000
;
// Reserved
821
end
822
endgenerate
823
824
//*****************************************************************
825
// DDR3 Load mode reg1
826
// Mode Register (MR1):
827
// [15:13] - unused - 00
828
// [12] - output enable - 0 (enabled for DQ, DQS, DQS#)
829
// [11] - TDQS enable - 0 (TDQS disabled and DM enabled)
830
// [10] - reserved - 0 (must be '0')
831
// [9] - RTT[2] - 0
832
// [8] - reserved - 0 (must be '0')
833
// [7] - write leveling - 0 (disabled), 1 (enabled)
834
// [6] - RTT[1] - RTT[1:0] = 0(no ODT), 1(75), 2(150), 3(50)
835
// [5] - Output driver impedance[1] - 0 (RZQ/6 and RZQ/7)
836
// [4:3] - Additive CAS - ADDITIVE_CAS
837
// [2] - RTT[0]
838
// [1] - Output driver impedance[0] - 0(RZQ/6), or 1 (RZQ/7)
839
// [0] - DLL enable - 0 (normal)
840
// DDR2 ext mode register
841
// Extended Mode Register (MR):
842
// [15:14] - unused - 00
843
// [13] - reserved - 0
844
// [12] - output enable - 0 (enabled)
845
// [11] - RDQS enable - 0 (disabled)
846
// [10] - DQS# enable - 0 (enabled)
847
// [9:7] - OCD Program - 111 or 000 (first 111, then 000 during init)
848
// [6] - RTT[1] - RTT[1:0] = 0(no ODT), 1(75), 2(150), 3(50)
849
// [5:3] - Additive CAS - ADDITIVE_CAS
850
// [2] - RTT[0]
851
// [1] - Output drive - REDUCE_DRV (= 0(full), = 1 (reduced)
852
// [0] - DLL enable - 0 (normal)
853
//*****************************************************************
854
855
generate
856
if
(
DRAM_TYPE
==
"DDR3"
)
begin
:
gen_load_mr1_DDR3
857
assign
load_mr1
[
0
] =
1'b0
;
// DLL enabled during Imitialization
858
assign
load_mr1
[
1
] = (
OUTPUT_DRV
==
"LOW"
) ?
1'b0
:
1'b1
;
859
assign
load_mr1
[
2
] = ((
RTT_NOM_int
==
"30"
) || (
RTT_NOM_int
==
"40"
) ||
860
(
RTT_NOM_int
==
"60"
)) ?
1'b1
:
1'b0
;
861
assign
load_mr1
[
4
:
3
] = (
AL
==
"0"
) ?
2'b00
:
862
(
AL
==
"CL-1"
) ?
2'b01
:
863
(
AL
==
"CL-2"
) ?
2'b10
:
2'b11
;
864
assign
load_mr1
[
5
] =
1'b0
;
865
assign
load_mr1
[
6
] = ((
RTT_NOM_int
==
"40"
) || (
RTT_NOM_int
==
"120"
)) ?
866
1'b1
:
1'b0
;
867
assign
load_mr1
[
7
] =
1'b0
;
// Enable write lvl after init sequence
868
assign
load_mr1
[
8
] =
1'b0
;
869
assign
load_mr1
[
9
] = ((
RTT_NOM_int
==
"20"
) || (
RTT_NOM_int
==
"30"
)) ?
870
1'b1
:
1'b0
;
871
assign
load_mr1
[
10
] =
1'b0
;
872
assign
load_mr1
[
15
:
11
] =
5'b00000
;
873
end
else
if
(
DRAM_TYPE
==
"DDR2"
)
begin
:
gen_load_mr1_DDR2
874
assign
load_mr1
[
0
] =
1'b0
;
// DLL enabled during Imitialization
875
assign
load_mr1
[
1
] = (
OUTPUT_DRV
==
"LOW"
) ?
1'b1
:
1'b0
;
876
assign
load_mr1
[
2
] = ((
RTT_NOM_int
==
"75"
) || (
RTT_NOM_int
==
"50"
)) ?
877
1'b1
:
1'b0
;
878
assign
load_mr1
[
5
:
3
] = (
AL
==
"0"
) ?
3'b000
:
879
(
AL
==
"1"
) ?
3'b001
:
880
(
AL
==
"2"
) ?
3'b010
:
881
(
AL
==
"3"
) ?
3'b011
:
882
(
AL
==
"4"
) ?
3'b100
:
3'b111
;
883
assign
load_mr1
[
6
] = ((
RTT_NOM_int
==
"50"
) ||
884
(
RTT_NOM_int
==
"150"
)) ?
1'b1
:
1'b0
;
885
assign
load_mr1
[
9
:
7
] =
3'b000
;
886
assign
load_mr1
[
10
] = (
DDR2_DQSN_ENABLE
==
"YES"
) ?
1'b0
:
1'b1
;
887
assign
load_mr1
[
15
:
11
] =
5'b00000
;
888
889
end
890
endgenerate
891
892
//*****************************************************************
893
// DDR3 Load mode reg2
894
// Mode Register (MR2):
895
// [15:11] - unused - 00
896
// [10:9] - RTT_WR - 00 (Dynamic ODT off)
897
// [8] - reserved - 0 (must be '0')
898
// [7] - self-refresh temperature range -
899
// 0 (normal), 1 (extended)
900
// [6] - Auto Self-Refresh - 0 (manual), 1(auto)
901
// [5:3] - CAS Write Latency (CWL) -
902
// 000 (5 for 400 MHz device),
903
// 001 (6 for 400 MHz to 533 MHz devices),
904
// 010 (7 for 533 MHz to 667 MHz devices),
905
// 011 (8 for 667 MHz to 800 MHz)
906
// [2:0] - Partial Array Self-Refresh (Optional) -
907
// 000 (full array)
908
// Not used for DDR2
909
//*****************************************************************
910
generate
911
if
(
DRAM_TYPE
==
"DDR3"
)
begin
:
gen_load_mr2_DDR3
912
assign
load_mr2
[
2
:
0
] =
3'b000
;
913
assign
load_mr2
[
5
:
3
] = (
nCWL
==
5
) ?
3'b000
:
914
(
nCWL
==
6
) ?
3'b001
:
915
(
nCWL
==
7
) ?
3'b010
:
916
(
nCWL
==
8
) ?
3'b011
:
917
(
nCWL
==
9
) ?
3'b100
:
918
(
nCWL
==
10
) ?
3'b101
:
919
(
nCWL
==
11
) ?
3'b110
:
3'b111
;
920
assign
load_mr2
[
6
] =
1'b0
;
921
assign
load_mr2
[
7
] =
1'b0
;
922
assign
load_mr2
[
8
] =
1'b0
;
923
// Dynamic ODT disabled
924
assign
load_mr2
[
10
:
9
] =
2'b00
;
925
assign
load_mr2
[
15
:
11
] =
5'b00000
;
926
end
else
begin
:
gen_load_mr2_DDR2
927
assign
load_mr2
[
15
:
0
] =
16'd0
;
928
end
929
endgenerate
930
931
//*****************************************************************
932
// DDR3 Load mode reg3
933
// Mode Register (MR3):
934
// [15:3] - unused - All zeros
935
// [2] - MPR Operation - 0(normal operation), 1(data flow from MPR)
936
// [1:0] - MPR location - 00 (Predefined pattern)
937
//*****************************************************************
938
939
assign
load_mr3
[
1
:
0
] =
2'b00
;
940
assign
load_mr3
[
2
] =
1'b0
;
941
assign
load_mr3
[
15
:
3
] =
13'b0000000000000
;
942
943
// For multi-rank systems the rank being accessed during writes in
944
// Read Leveling must be sent to phy_write for the bitslip logic
945
assign
calib_rank_cnt
=
chip_cnt_r
;
946
947
//***************************************************************************
948
// Logic to begin initial calibration, and to handle precharge requests
949
// during read-leveling (to avoid tRAS violations if individual read
950
// levelling calibration stages take more than max{tRAS) to complete).
951
//***************************************************************************
952
953
// Assert when readback for each stage of read-leveling begins. However,
954
// note this indicates only when the read command is issued and when
955
// Phaser_IN has phase aligned FREQ_REF clock to read DQS. It does not
956
// indicate when the read data is present on the bus (when this happens
957
// after the read command is issued depends on CAS LATENCY) - there will
958
// need to be some delay before valid data is present on the bus.
959
// assign rdlvl_start_pre = (init_state_r == INIT_PI_PHASELOCK_READS);
960
961
// Assert when read back for oclkdelay calibration begins
962
assign
oclkdelay_calib_start_pre
= (
init_state_r
==
INIT_OCLKDELAY_READ
);
963
964
// Assert when read back for write calibration begins
965
assign
wrcal_start_pre
= (
init_state_r
==
INIT_WRCAL_READ
) || (
init_state_r
==
INIT_WRCAL_MULT_READS
);
966
967
// Common precharge signal done signal - pulses only when there has been
968
// a precharge issued as a result of a PRECH_REQ pulse. Note also a common
969
// PRECH_DONE signal is used for all blocks
970
assign
prech_done_pre
= (((
init_state_r
==
INIT_RDLVL_STG1_READ
) ||
971
((
rdlvl_last_byte_done_r
||
prbs_last_byte_done_r
) && (
init_state_r
==
INIT_RDLVL_ACT_WAIT
) &&
cnt_cmd_done_r
) ||
972
(
dqs_found_prech_req
&& (
init_state_r
==
INIT_RDLVL_ACT_WAIT
)) ||
973
(
init_state_r
==
INIT_MPR_RDEN
) ||
974
((
init_state_r
==
INIT_WRCAL_ACT_WAIT
) &&
cnt_cmd_done_r
) ||
975
((
init_state_r
==
INIT_OCLKDELAY_ACT_WAIT
) &&
cnt_cmd_done_r
) ||
976
(
wrlvl_final
&& (
init_state_r
==
INIT_REFRESH_WAIT
) &&
cnt_cmd_done_r
&& ~
oclkdelay_calib_done
)) &&
977
prech_pending_r
&&
978
!
prech_req_posedge_r
);
979
980
always
@(
posedge
clk
)
981
if
(
rst
)
982
pi_phaselock_start
<= #TCQ
1'b0
;
983
else
if
(
init_state_r
==
INIT_PI_PHASELOCK_READS
)
984
pi_phaselock_start
<= #TCQ
1'b1
;
985
986
// Delay start of each calibration by 16 clock cycles to ensure that when
987
// calibration logic begins, read data is already appearing on the bus.
988
// Each circuit should synthesize using an SRL16. Assume that reset is
989
// long enough to clear contents of SRL16.
990
always
@(
posedge
clk
)
begin
991
rdlvl_last_byte_done_r
<= #TCQ
rdlvl_last_byte_done
;
992
prbs_last_byte_done_r
<= #TCQ
prbs_last_byte_done
;
993
rdlvl_start_dly0_r
<= #TCQ {
rdlvl_start_dly0_r
[
14
:
0
],
994
rdlvl_start_pre
};
995
wrcal_start_dly_r
<= #TCQ {
wrcal_start_dly_r
[
14
:
0
],
996
wrcal_start_pre
};
997
oclkdelay_start_dly_r
<= #TCQ {
oclkdelay_start_dly_r
[
14
:
0
],
998
oclkdelay_calib_start_pre
};
999
prech_done_dly_r
<= #TCQ {
prech_done_dly_r
[
14
:
0
],
1000
prech_done_pre
};
1001
end
1002
1003
always
@(
posedge
clk
)
1004
prech_done
<= #TCQ
prech_done_dly_r
[
15
];
1005
1006
always
@(
posedge
clk
)
1007
if
(
rst
)
1008
mpr_rdlvl_start
<= #TCQ
1'b0
;
1009
else
if
(
pi_dqs_found_done
&&
1010
(
init_state_r
==
INIT_MPR_READ
))
1011
mpr_rdlvl_start
<= #TCQ
1'b1
;
1012
1013
always
@(
posedge
clk
)
1014
phy_if_empty_r
<= #TCQ
phy_if_empty
;
1015
1016
always
@(
posedge
clk
)
1017
if
(
rst
|| (
phy_if_empty_r
&&
prbs_rdlvl_prech_req
) ||
1018
((
stg1_wr_rd_cnt
==
'd1
) && ~
stg1_wr_done
) ||
prbs_rdlvl_done
)
1019
prbs_gen_clk_en
<= #TCQ
1'b0
;
1020
else
if
((~
phy_if_empty_r
&&
rdlvl_stg1_done_r1
&& ~
prbs_rdlvl_done
) ||
1021
((
init_state_r
==
INIT_RDLVL_ACT_WAIT
) &&
rdlvl_stg1_done_r1
&& (
cnt_cmd_r
==
'd0
)))
1022
prbs_gen_clk_en
<= #TCQ
1'b1
;
1023
1024
generate
1025
if
(
RANKS
<
2
)
begin
1026
always
@(
posedge
clk
)
1027
if
(
rst
)
begin
1028
rdlvl_stg1_start
<= #TCQ
1'b0
;
1029
rdlvl_stg1_start_int
<= #TCQ
1'b0
;
1030
rdlvl_start_pre
<= #TCQ
1'b0
;
1031
prbs_rdlvl_start
<= #TCQ
1'b0
;
1032
end
else
begin
1033
if
(
pi_dqs_found_done
&&
cnt_cmd_done_r
&&
1034
(
init_state_r
==
INIT_RDLVL_ACT_WAIT
))
1035
rdlvl_stg1_start_int
<= #TCQ
1'b1
;
1036
if
(
pi_dqs_found_done
&&
1037
(
init_state_r
==
INIT_RDLVL_STG1_READ
))
begin
1038
rdlvl_start_pre
<= #TCQ
1'b1
;
1039
rdlvl_stg1_start
<= #TCQ
rdlvl_start_dly0_r
[
14
];
1040
end
1041
if
(
pi_dqs_found_done
&&
rdlvl_stg1_done
&&
1042
(
init_state_r
==
INIT_RDLVL_STG1_READ
) && (
WRLVL
==
"ON"
))
begin
1043
prbs_rdlvl_start
<= #TCQ
1'b1
;
1044
end
1045
end
1046
end
else
begin
1047
always
@(
posedge
clk
)
1048
if
(
rst
||
rdlvl_stg1_rank_done
)
begin
1049
rdlvl_stg1_start
<= #TCQ
1'b0
;
1050
rdlvl_stg1_start_int
<= #TCQ
1'b0
;
1051
rdlvl_start_pre
<= #TCQ
1'b0
;
1052
prbs_rdlvl_start
<= #TCQ
1'b0
;
1053
end
else
begin
1054
if
(
pi_dqs_found_done
&&
cnt_cmd_done_r
&&
1055
(
init_state_r
==
INIT_RDLVL_ACT_WAIT
))
1056
rdlvl_stg1_start_int
<= #TCQ
1'b1
;
1057
if
(
pi_dqs_found_done
&&
1058
(
init_state_r
==
INIT_RDLVL_STG1_READ
))
begin
1059
rdlvl_start_pre
<= #TCQ
1'b1
;
1060
rdlvl_stg1_start
<= #TCQ
rdlvl_start_dly0_r
[
14
];
1061
end
1062
if
(
pi_dqs_found_done
&&
rdlvl_stg1_done
&&
1063
(
init_state_r
==
INIT_RDLVL_STG1_READ
) && (
WRLVL
==
"ON"
))
begin
1064
prbs_rdlvl_start
<= #TCQ
1'b1
;
1065
end
1066
end
1067
end
1068
endgenerate
1069
1070
1071
always
@(
posedge
clk
)
begin
1072
if
(
rst
||
dqsfound_retry
||
wrlvl_byte_redo
)
begin
1073
pi_dqs_found_start
<= #TCQ
1'b0
;
1074
wrcal_start
<= #TCQ
1'b0
;
1075
end
else
begin
1076
if
(!
pi_dqs_found_done
&&
init_state_r
==
INIT_RDLVL_STG2_READ
)
1077
pi_dqs_found_start
<= #TCQ
1'b1
;
1078
if
(
wrcal_start_dly_r
[
5
])
1079
wrcal_start
<= #TCQ
1'b1
;
1080
end
1081
end
// else: !if(rst)
1082
1083
1084
always
@(
posedge
clk
)
1085
if
(
rst
)
1086
oclkdelay_calib_start
<= #TCQ
1'b0
;
1087
else
if
(
oclkdelay_start_dly_r
[
5
])
1088
oclkdelay_calib_start
<= #TCQ
1'b1
;
1089
1090
always
@(
posedge
clk
)
1091
if
(
rst
)
1092
pi_dqs_found_done_r1
<= #TCQ
1'b0
;
1093
else
1094
pi_dqs_found_done_r1
<= #TCQ
pi_dqs_found_done
;
1095
1096
1097
always
@(
posedge
clk
)
1098
wrlvl_final_r
<= #TCQ
wrlvl_final
;
1099
1100
// Reset IN_FIFO after final write leveling to make sure the FIFO
1101
// pointers are initialized
1102
always
@(
posedge
clk
)
1103
if
(
rst
|| (
init_state_r
==
INIT_WRCAL_WRITE
) || (
init_state_r
==
INIT_REFRESH
))
1104
wrlvl_final_if_rst
<= #TCQ
1'b0
;
1105
else
if
(
wrlvl_done_r
&&
//(wrlvl_final_r && wrlvl_done_r &&
1106
(
init_state_r
==
INIT_WRLVL_LOAD_MR2
))
1107
wrlvl_final_if_rst
<= #TCQ
1'b1
;
1108
1109
// Constantly enable DQS while write leveling is enabled in the memory
1110
// This is more to get rid of warnings in simulation, can later change
1111
// this code to only enable WRLVL_ACTIVE when WRLVL_START is asserted
1112
1113
always
@(
posedge
clk
)
1114
if
(
rst
||
1115
((
init_state_r1
!=
INIT_WRLVL_START
) &&
1116
(
init_state_r
==
INIT_WRLVL_START
)))
1117
wrlvl_odt_ctl
<= #TCQ
1'b0
;
1118
else
if
(
wrlvl_rank_done
&& ~
wrlvl_rank_done_r1
)
1119
wrlvl_odt_ctl
<= #TCQ
1'b1
;
1120
1121
generate
1122
if
(
nCK_PER_CLK
==
4
)
begin
:
en_cnt_div4
1123
always
@ (
posedge
clk
)
1124
if
(
rst
)
1125
enable_wrlvl_cnt
<= #TCQ
5'd0
;
1126
else
if
((
init_state_r
==
INIT_WRLVL_START
) ||
1127
(
wrlvl_odt
&& (
enable_wrlvl_cnt
==
5'd0
)))
1128
enable_wrlvl_cnt
<= #TCQ
5'd12
;
1129
else
if
((
enable_wrlvl_cnt
>
5'd0
) && ~(
phy_ctl_full
||
phy_cmd_full
))
1130
enable_wrlvl_cnt
<= #TCQ
enable_wrlvl_cnt
-
1
;
1131
1132
// ODT stays asserted as long as write_calib
1133
// signal is asserted
1134
always
@(
posedge
clk
)
1135
if
(
rst
||
wrlvl_odt_ctl
)
1136
wrlvl_odt
<= #TCQ
1'b0
;
1137
else
if
(
enable_wrlvl_cnt
==
5'd1
)
1138
wrlvl_odt
<= #TCQ
1'b1
;
1139
1140
end
else
begin
:
en_cnt_div2
1141
always
@ (
posedge
clk
)
1142
if
(
rst
)
1143
enable_wrlvl_cnt
<= #TCQ
5'd0
;
1144
else
if
((
init_state_r
==
INIT_WRLVL_START
) ||
1145
(
wrlvl_odt
&& (
enable_wrlvl_cnt
==
5'd0
)))
1146
enable_wrlvl_cnt
<= #TCQ
5'd21
;
1147
else
if
((
enable_wrlvl_cnt
>
5'd0
) && ~(
phy_ctl_full
||
phy_cmd_full
))
1148
enable_wrlvl_cnt
<= #TCQ
enable_wrlvl_cnt
-
1
;
1149
1150
// ODT stays asserted as long as write_calib
1151
// signal is asserted
1152
always
@(
posedge
clk
)
1153
if
(
rst
||
wrlvl_odt_ctl
)
1154
wrlvl_odt
<= #TCQ
1'b0
;
1155
else
if
(
enable_wrlvl_cnt
==
5'd1
)
1156
wrlvl_odt
<= #TCQ
1'b1
;
1157
1158
end
1159
endgenerate
1160
1161
always
@(
posedge
clk
)
1162
if
(
rst
||
wrlvl_rank_done
||
done_dqs_tap_inc
)
1163
wrlvl_active
<= #TCQ
1'b0
;
1164
else
if
((
enable_wrlvl_cnt
==
5'd1
) &&
wrlvl_odt
&& !
wrlvl_active
)
1165
wrlvl_active
<= #TCQ
1'b1
;
1166
1167
// signal used to assert DQS for write leveling.
1168
// the DQS will be asserted once every 16 clock cycles.
1169
always
@(
posedge
clk
)
begin
1170
if
(
rst
|| (
enable_wrlvl_cnt
!=
5'd1
))
begin
1171
wr_level_dqs_asrt
<= #TCQ
1'd0
;
1172
end
else
if
((
enable_wrlvl_cnt
==
5'd1
) && (
wrlvl_active_r1
))
begin
1173
wr_level_dqs_asrt
<= #TCQ
1'd1
;
1174
end
1175
end
1176
1177
always
@ (
posedge
clk
)
begin
1178
if
(
rst
|| (
wrlvl_done_r
&& ~
wrlvl_done_r1
))
1179
dqs_asrt_cnt
<= #TCQ
2'd0
;
1180
else
if
(
wr_level_dqs_asrt
&&
dqs_asrt_cnt
!=
2'd3
)
1181
dqs_asrt_cnt
<= #TCQ (
dqs_asrt_cnt
+
1
);
1182
end
1183
1184
always
@ (
posedge
clk
)
begin
1185
if
(
rst
|| ~
wrlvl_active
)
1186
wr_lvl_start
<= #TCQ
1'd0
;
1187
else
if
(
dqs_asrt_cnt
==
2'd3
)
1188
wr_lvl_start
<= #TCQ
1'd1
;
1189
end
1190
1191
1192
always
@(
posedge
clk
)
begin
1193
if
(
rst
)
1194
wl_sm_start
<= #TCQ
1'b0
;
1195
else
1196
wl_sm_start
<= #TCQ
wr_level_dqs_asrt_r1
;
1197
end
1198
1199
1200
always
@(
posedge
clk
)
begin
1201
wrlvl_active_r1
<= #TCQ
wrlvl_active
;
1202
wr_level_dqs_asrt_r1
<= #TCQ
wr_level_dqs_asrt
;
1203
wrlvl_done_r
<= #TCQ
wrlvl_done
;
1204
wrlvl_done_r1
<= #TCQ
wrlvl_done_r
;
1205
wrlvl_rank_done_r1
<= #TCQ
wrlvl_rank_done
;
1206
wrlvl_rank_done_r2
<= #TCQ
wrlvl_rank_done_r1
;
1207
wrlvl_rank_done_r3
<= #TCQ
wrlvl_rank_done_r2
;
1208
wrlvl_rank_done_r4
<= #TCQ
wrlvl_rank_done_r3
;
1209
wrlvl_rank_done_r5
<= #TCQ
wrlvl_rank_done_r4
;
1210
wrlvl_rank_done_r6
<= #TCQ
wrlvl_rank_done_r5
;
1211
wrlvl_rank_done_r7
<= #TCQ
wrlvl_rank_done_r6
;
1212
end
1213
1214
always
@ (
posedge
clk
)
begin
1215
//if (rst)
1216
wrlvl_rank_cntr
<= #TCQ
3'd0
;
1217
//else if (wrlvl_rank_done)
1218
// wrlvl_rank_cntr <= #TCQ wrlvl_rank_cntr + 1'b1;
1219
end
1220
1221
//*****************************************************************
1222
// Precharge request logic - those calibration logic blocks
1223
// that require greater than tRAS(max) to finish must break up
1224
// their calibration into smaller units of time, with precharges
1225
// issued in between. This is done using the XXX_PRECH_REQ and
1226
// PRECH_DONE handshaking between PHY_INIT and those blocks
1227
//*****************************************************************
1228
1229
// Shared request from multiple sources
1230
assign
prech_req
=
oclk_prech_req
|
rdlvl_prech_req
|
wrcal_prech_req
|
prbs_rdlvl_prech_req
|
1231
(
dqs_found_prech_req
& (
init_state_r
==
INIT_RDLVL_STG2_READ_WAIT
));
1232
1233
// Handshaking logic to force precharge during read leveling, and to
1234
// notify read leveling logic when precharge has been initiated and
1235
// it's okay to proceed with leveling again
1236
always
@(
posedge
clk
)
1237
if
(
rst
)
begin
1238
prech_req_r
<= #TCQ
1'b0
;
1239
prech_req_posedge_r
<= #TCQ
1'b0
;
1240
prech_pending_r
<= #TCQ
1'b0
;
1241
end
else
begin
1242
prech_req_r
<= #TCQ
prech_req
;
1243
prech_req_posedge_r
<= #TCQ
prech_req
& ~
prech_req_r
;
1244
if
(
prech_req_posedge_r
)
1245
prech_pending_r
<= #TCQ
1'b1
;
1246
// Clear after we've finished with the precharge and have
1247
// returned to issuing read leveling calibration reads
1248
else
if
(
prech_done_pre
)
1249
prech_pending_r
<= #TCQ
1'b0
;
1250
end
1251
1252
//***************************************************************************
1253
// Various timing counters
1254
//***************************************************************************
1255
1256
//*****************************************************************
1257
// Generic delay for various states that require it (e.g. for turnaround
1258
// between read and write). Make this a sufficiently large number of clock
1259
// cycles to cover all possible frequencies and memory components)
1260
// Requirements for this counter:
1261
// 1. Greater than tMRD
1262
// 2. tRFC (refresh-active) for DDR2
1263
// 3. (list the other requirements, slacker...)
1264
//*****************************************************************
1265
1266
always
@(
posedge
clk
)
begin
1267
case
(
init_state_r
)
1268
INIT_LOAD_MR_WAIT
,
1269
INIT_WRLVL_LOAD_MR_WAIT
,
1270
INIT_WRLVL_LOAD_MR2_WAIT
,
1271
INIT_MPR_WAIT
,
1272
INIT_MPR_DISABLE_PREWAIT
,
1273
INIT_MPR_DISABLE_WAIT
,
1274
INIT_OCLKDELAY_ACT_WAIT
,
1275
INIT_OCLKDELAY_WRITE_WAIT
,
1276
INIT_RDLVL_ACT_WAIT
,
1277
INIT_RDLVL_STG1_WRITE_READ
,
1278
INIT_RDLVL_STG2_READ_WAIT
,
1279
INIT_WRCAL_ACT_WAIT
,
1280
INIT_WRCAL_WRITE_READ
,
1281
INIT_WRCAL_READ_WAIT
,
1282
INIT_PRECHARGE_PREWAIT
,
1283
INIT_PRECHARGE_WAIT
,
1284
INIT_DDR2_PRECHARGE_WAIT
,
1285
INIT_REG_WRITE_WAIT
,
1286
INIT_REFRESH_WAIT
,
1287
INIT_REFRESH_RNK2_WAIT
:
begin
1288
if
(
phy_ctl_full
||
phy_cmd_full
)
1289
cnt_cmd_r
<= #TCQ
cnt_cmd_r
;
1290
else
1291
cnt_cmd_r
<= #TCQ
cnt_cmd_r
+
1
;
1292
end
1293
INIT_WRLVL_WAIT
:
1294
cnt_cmd_r
<= #TCQ
'b0
;
1295
default
:
1296
cnt_cmd_r
<= #TCQ
'b0
;
1297
endcase
1298
end
1299
1300
// pulse when count reaches terminal count
1301
always
@(
posedge
clk
)
1302
cnt_cmd_done_r
<= #TCQ (
cnt_cmd_r
==
CNTNEXT_CMD
);
1303
1304
// For ODT deassertion - hold throughout post read/write wait stage, but
1305
// deassert before next command. The post read/write stage is very long, so
1306
// we simply address the longest case here plus some margin.
1307
always
@(
posedge
clk
)
1308
cnt_cmd_done_m7_r
<= #TCQ (
cnt_cmd_r
== (
CNTNEXT_CMD
-
7
));
1309
1310
//************************************************************************
1311
// Added to support PO fine delay inc when TG errors
1312
always
@(
posedge
clk
)
begin
1313
case
(
init_state_r
)
1314
INIT_WRCAL_READ_WAIT
:
begin
1315
if
(
phy_ctl_full
||
phy_cmd_full
)
1316
cnt_wait
<= #TCQ
cnt_wait
;
1317
else
1318
cnt_wait
<= #TCQ
cnt_wait
+
1
;
1319
end
1320
default
:
1321
cnt_wait
<= #TCQ
'b0
;
1322
endcase
1323
end
1324
1325
always
@(
posedge
clk
)
1326
cnt_wrcal_rd
<= #TCQ (
cnt_wait
==
'd4
);
1327
1328
always
@(
posedge
clk
)
begin
1329
if
(
rst
|| ~
temp_wrcal_done
)
1330
temp_lmr_done
<= #TCQ
1'b0
;
1331
else
if
(
temp_wrcal_done
&& (
init_state_r
==
INIT_LOAD_MR
))
1332
temp_lmr_done
<= #TCQ
1'b1
;
1333
end
1334
1335
always
@(
posedge
clk
)
1336
temp_wrcal_done_r
<= #TCQ
temp_wrcal_done
;
1337
1338
always
@(
posedge
clk
)
1339
if
(
rst
)
begin
1340
tg_timer_go
<= #TCQ
1'b0
;
1341
end
else
if
((
PRE_REV3ES
==
"ON"
) &&
temp_wrcal_done
&&
temp_lmr_done
&&
1342
(
init_state_r
==
INIT_WRCAL_READ_WAIT
))
begin
1343
tg_timer_go
<= #TCQ
1'b1
;
1344
end
else
begin
1345
tg_timer_go
<= #TCQ
1'b0
;
1346
end
1347
1348
always
@(
posedge
clk
)
begin
1349
if
(
rst
|| (
temp_wrcal_done
&& ~
temp_wrcal_done_r
) ||
1350
(
init_state_r
==
INIT_PRECHARGE_PREWAIT
))
1351
tg_timer
<= #TCQ
'd0
;
1352
else
if
((
pi_phaselock_timer
==
PHASELOCKED_TIMEOUT
) &&
1353
tg_timer_go
&&
1354
(
tg_timer
!=
TG_TIMER_TIMEOUT
))
1355
tg_timer
<= #TCQ
tg_timer
+
1
;
1356
end
1357
1358
always
@(
posedge
clk
)
begin
1359
if
(
rst
)
1360
tg_timer_done
<= #TCQ
1'b0
;
1361
else
if
(
tg_timer
==
TG_TIMER_TIMEOUT
)
1362
tg_timer_done
<= #TCQ
1'b1
;
1363
else
1364
tg_timer_done
<= #TCQ
1'b0
;
1365
end
1366
1367
always
@(
posedge
clk
)
begin
1368
if
(
rst
)
1369
no_rst_tg_mc
<= #TCQ
1'b0
;
1370
else
if
((
init_state_r
==
INIT_WRCAL_ACT
) &&
wrcal_read_req
)
1371
no_rst_tg_mc
<= #TCQ
1'b1
;
1372
else
1373
no_rst_tg_mc
<= #TCQ
1'b0
;
1374
end
1375
1376
//************************************************************************
1377
1378
always
@(
posedge
clk
)
begin
1379
if
(
rst
)
1380
detect_pi_found_dqs
<= #TCQ
1'b0
;
1381
else
if
((
cnt_cmd_r
==
7'b0111111
) &&
1382
(
init_state_r
==
INIT_RDLVL_STG2_READ_WAIT
))
1383
detect_pi_found_dqs
<= #TCQ
1'b1
;
1384
else
1385
detect_pi_found_dqs
<= #TCQ
1'b0
;
1386
end
1387
1388
//*****************************************************************
1389
// Initial delay after power-on for RESET, CKE
1390
// NOTE: Could reduce power consumption by turning off these counters
1391
// after initial power-up (at expense of more logic)
1392
// NOTE: Likely can combine multiple counters into single counter
1393
//*****************************************************************
1394
1395
// Create divided by 1024 version of clock
1396
always
@(
posedge
clk
)
1397
if
(
rst
)
begin
1398
cnt_pwron_ce_r
<= #TCQ
10'h000
;
1399
pwron_ce_r
<= #TCQ
1'b0
;
1400
end
else
begin
1401
cnt_pwron_ce_r
<= #TCQ
cnt_pwron_ce_r
+
1
;
1402
pwron_ce_r
<= #TCQ (
cnt_pwron_ce_r
==
10'h3FF
);
1403
end
1404
1405
// "Main" power-on counter - ticks every CLKDIV/1024 cycles
1406
always
@(
posedge
clk
)
1407
if
(
rst
)
1408
cnt_pwron_r
<= #TCQ
'b0
;
1409
else
if
(
pwron_ce_r
)
1410
cnt_pwron_r
<= #TCQ
cnt_pwron_r
+
1
;
1411
1412
always
@(
posedge
clk
)
1413
if
(
rst
|| ~
phy_ctl_ready
)
begin
1414
cnt_pwron_reset_done_r
<= #TCQ
1'b0
;
1415
cnt_pwron_cke_done_r
<= #TCQ
1'b0
;
1416
end
else
begin
1417
// skip power-up count for simulation purposes only
1418
if
((
SIM_INIT_OPTION
==
"SKIP_PU_DLY"
) ||
1419
(
SIM_INIT_OPTION
==
"SKIP_INIT"
))
begin
1420
cnt_pwron_reset_done_r
<= #TCQ
1'b1
;
1421
cnt_pwron_cke_done_r
<= #TCQ
1'b1
;
1422
end
else
begin
1423
// otherwise, create latched version of done signal for RESET, CKE
1424
if
(
DRAM_TYPE
==
"DDR3"
)
begin
1425
if
(!
cnt_pwron_reset_done_r
)
1426
cnt_pwron_reset_done_r
1427
<= #TCQ (
cnt_pwron_r
==
PWRON_RESET_DELAY_CNT
);
1428
if
(!
cnt_pwron_cke_done_r
)
1429
cnt_pwron_cke_done_r
1430
<= #TCQ (
cnt_pwron_r
==
PWRON_CKE_DELAY_CNT
);
1431
end
else
begin
// DDR2
1432
cnt_pwron_reset_done_r
<= #TCQ
1'b1
;
// not needed
1433
if
(!
cnt_pwron_cke_done_r
)
1434
cnt_pwron_cke_done_r
1435
<= #TCQ (
cnt_pwron_r
==
PWRON_CKE_DELAY_CNT
);
1436
end
1437
end
1438
end
// else: !if(rst || ~phy_ctl_ready)
1439
1440
1441
always
@(
posedge
clk
)
1442
cnt_pwron_cke_done_r1
<= #TCQ
cnt_pwron_cke_done_r
;
1443
1444
// Keep RESET asserted and CKE deasserted until after power-on delay
1445
always
@(
posedge
clk
or
posedge
rst
)
begin
1446
if
(
rst
)
1447
phy_reset_n
<= #TCQ
1'b0
;
1448
else
1449
phy_reset_n
<= #TCQ
cnt_pwron_reset_done_r
;
1450
// phy_cke <= #TCQ {CKE_WIDTH{cnt_pwron_cke_done_r}};
1451
end
1452
1453
//*****************************************************************
1454
// Counter for tXPR (pronouned "Tax-Payer") - wait time after
1455
// CKE deassertion before first MRS command can be asserted
1456
//*****************************************************************
1457
1458
always
@(
posedge
clk
)
1459
if
(!
cnt_pwron_cke_done_r
)
begin
1460
cnt_txpr_r
<= #TCQ
'b0
;
1461
cnt_txpr_done_r
<= #TCQ
1'b0
;
1462
end
else
begin
1463
cnt_txpr_r
<= #TCQ
cnt_txpr_r
+
1
;
1464
if
(!
cnt_txpr_done_r
)
1465
cnt_txpr_done_r
<= #TCQ (
cnt_txpr_r
==
TXPR_DELAY_CNT
);
1466
end
1467
1468
//*****************************************************************
1469
// Counter for the initial 400ns wait for issuing precharge all
1470
// command after CKE assertion. Only for DDR2.
1471
//*****************************************************************
1472
1473
always
@(
posedge
clk
)
1474
if
(!
cnt_pwron_cke_done_r
)
begin
1475
cnt_init_pre_wait_r
<= #TCQ
'b0
;
1476
cnt_init_pre_wait_done_r
<= #TCQ
1'b0
;
1477
end
else
begin
1478
cnt_init_pre_wait_r
<= #TCQ
cnt_init_pre_wait_r
+
1
;
1479
if
(!
cnt_init_pre_wait_done_r
)
1480
cnt_init_pre_wait_done_r
1481
<= #TCQ (
cnt_init_pre_wait_r
>=
DDR2_INIT_PRE_CNT
);
1482
end
1483
1484
//*****************************************************************
1485
// Wait for both DLL to lock (tDLLK) and ZQ calibration to finish
1486
// (tZQINIT). Both take the same amount of time (512*tCK)
1487
//*****************************************************************
1488
1489
always
@(
posedge
clk
)
1490
if
(
init_state_r
==
INIT_ZQCL
)
begin
1491
cnt_dllk_zqinit_r
<= #TCQ
'b0
;
1492
cnt_dllk_zqinit_done_r
<= #TCQ
1'b0
;
1493
end
else
if
(~(
phy_ctl_full
||
phy_cmd_full
))
begin
1494
cnt_dllk_zqinit_r
<= #TCQ
cnt_dllk_zqinit_r
+
1
;
1495
if
(!
cnt_dllk_zqinit_done_r
)
1496
cnt_dllk_zqinit_done_r
1497
<= #TCQ (
cnt_dllk_zqinit_r
==
TDLLK_TZQINIT_DELAY_CNT
);
1498
end
1499
1500
//*****************************************************************
1501
// Keep track of which MRS counter needs to be programmed during
1502
// memory initialization
1503
// The counter and the done signal are reset an additional time
1504
// for DDR2. The same signals are used for the additional DDR2
1505
// initialization sequence.
1506
//*****************************************************************
1507
1508
always
@(
posedge
clk
)
1509
if
((
init_state_r
==
INIT_IDLE
)||
1510
((
init_state_r
==
INIT_REFRESH
)
1511
&& (~
mem_init_done_r
)))
begin
1512
cnt_init_mr_r
<= #TCQ
'b0
;
1513
cnt_init_mr_done_r
<= #TCQ
1'b0
;
1514
end
else
if
(
init_state_r
==
INIT_LOAD_MR
)
begin
1515
cnt_init_mr_r
<= #TCQ
cnt_init_mr_r
+
1
;
1516
cnt_init_mr_done_r
<= #TCQ (
cnt_init_mr_r
==
INIT_CNT_MR_DONE
);
1517
end
1518
1519
1520
//*****************************************************************
1521
// Flag to tell if the first precharge for DDR2 init sequence is
1522
// done
1523
//*****************************************************************
1524
1525
always
@(
posedge
clk
)
1526
if
(
init_state_r
==
INIT_IDLE
)
1527
ddr2_pre_flag_r
<= #TCQ
'b0
;
1528
else
if
(
init_state_r
==
INIT_LOAD_MR
)
1529
ddr2_pre_flag_r
<= #TCQ
1'b1
;
1530
// reset the flag for multi rank case
1531
else
if
((
ddr2_refresh_flag_r
) &&
1532
(
init_state_r
==
INIT_LOAD_MR_WAIT
)&&
1533
(
cnt_cmd_done_r
) && (
cnt_init_mr_done_r
))
1534
ddr2_pre_flag_r
<= #TCQ
'b0
;
1535
1536
//*****************************************************************
1537
// Flag to tell if the refresh stat for DDR2 init sequence is
1538
// reached
1539
//*****************************************************************
1540
1541
always
@(
posedge
clk
)
1542
if
(
init_state_r
==
INIT_IDLE
)
1543
ddr2_refresh_flag_r
<= #TCQ
'b0
;
1544
else
if
((
init_state_r
==
INIT_REFRESH
) && (~
mem_init_done_r
))
1545
// reset the flag for multi rank case
1546
ddr2_refresh_flag_r
<= #TCQ
1'b1
;
1547
else
if
((
ddr2_refresh_flag_r
) &&
1548
(
init_state_r
==
INIT_LOAD_MR_WAIT
)&&
1549
(
cnt_cmd_done_r
) && (
cnt_init_mr_done_r
))
1550
ddr2_refresh_flag_r
<= #TCQ
'b0
;
1551
1552
//*****************************************************************
1553
// Keep track of the number of auto refreshes for DDR2
1554
// initialization. The spec asks for a minimum of two refreshes.
1555
// Four refreshes are performed here. The two extra refreshes is to
1556
// account for the 200 clock cycle wait between step h and l.
1557
// Without the two extra refreshes we would have to have a
1558
// wait state.
1559
//*****************************************************************
1560
1561
always
@(
posedge
clk
)
1562
if
(
init_state_r
==
INIT_IDLE
)
begin
1563
cnt_init_af_r
<= #TCQ
'b0
;
1564
cnt_init_af_done_r
<= #TCQ
1'b0
;
1565
end
else
if
((
init_state_r
==
INIT_REFRESH
) && (~
mem_init_done_r
))
begin
1566
cnt_init_af_r
<= #TCQ
cnt_init_af_r
+
1
;
1567
cnt_init_af_done_r
<= #TCQ (
cnt_init_af_r
==
2'b11
);
1568
end
1569
1570
//*****************************************************************
1571
// Keep track of the register control word programming for
1572
// DDR3 RDIMM
1573
//*****************************************************************
1574
1575
always
@(
posedge
clk
)
1576
if
(
init_state_r
==
INIT_IDLE
)
1577
reg_ctrl_cnt_r
<= #TCQ
'b0
;
1578
else
if
(
init_state_r
==
INIT_REG_WRITE
)
1579
reg_ctrl_cnt_r
<= #TCQ
reg_ctrl_cnt_r
+
1
;
1580
1581
generate
1582
if
(
RANKS
<
2
)
begin
:
one_rank
1583
always
@(
posedge
clk
)
1584
if
((
init_state_r
==
INIT_IDLE
) ||
rdlvl_last_byte_done
)
1585
stg1_wr_done
<= #TCQ
1'b0
;
1586
else
if
(
init_state_r
==
INIT_RDLVL_STG1_WRITE_READ
)
1587
stg1_wr_done
<= #TCQ
1'b1
;
1588
end
else
begin
:
two_ranks
1589
always
@(
posedge
clk
)
1590
if
((
init_state_r
==
INIT_IDLE
) ||
rdlvl_last_byte_done
||
1591
(
rdlvl_stg1_rank_done
))
1592
stg1_wr_done
<= #TCQ
1'b0
;
1593
else
if
(
init_state_r
==
INIT_RDLVL_STG1_WRITE_READ
)
1594
stg1_wr_done
<= #TCQ
1'b1
;
1595
end
1596
endgenerate
1597
1598
always
@(
posedge
clk
)
1599
if
(
rst
)
1600
rnk_ref_cnt
<= #TCQ
1'b0
;
1601
else
if
(
stg1_wr_done
&&
1602
(
init_state_r
==
INIT_REFRESH_WAIT
) &&
cnt_cmd_done_r
)
1603
rnk_ref_cnt
<= #TCQ ~
rnk_ref_cnt
;
1604
1605
1606
always
@(
posedge
clk
)
1607
if
(
rst
|| (
init_state_r
==
INIT_MPR_RDEN
) ||
1608
(
init_state_r
==
INIT_OCLKDELAY_ACT
) || (
init_state_r
==
INIT_RDLVL_ACT
))
1609
num_refresh
<= #TCQ
'd0
;
1610
else
if
((
init_state_r
==
INIT_REFRESH
) &&
1611
(~
pi_dqs_found_done
|| ((
DRAM_TYPE
==
"DDR3"
) && ~
oclkdelay_calib_done
) ||
1612
(
rdlvl_stg1_done
&& ~
prbs_rdlvl_done
) ||
1613
((
CLK_PERIOD
/
nCK_PER_CLK
<=
2500
) &&
wrcal_done
&& ~
rdlvl_stg1_done
) ||
1614
((
CLK_PERIOD
/
nCK_PER_CLK
>
2500
) &&
wrlvl_done_r1
&& ~
rdlvl_stg1_done
)))
1615
num_refresh
<= #TCQ
num_refresh
+
1
;
1616
1617
1618
//***************************************************************************
1619
// Initialization state machine
1620
//***************************************************************************
1621
1622
//*****************************************************************
1623
// Next-state logic
1624
//*****************************************************************
1625
1626
always
@(
posedge
clk
)
1627
if
(
rst
)
begin
1628
init_state_r
<= #TCQ
INIT_IDLE
;
1629
init_state_r1
<= #TCQ
INIT_IDLE
;
1630
end
else
begin
1631
init_state_r
<= #TCQ
init_next_state
;
1632
init_state_r1
<= #TCQ
init_state_r
;
1633
end
1634
1635
always
@(
burst_addr_r
or
chip_cnt_r
or
cnt_cmd_done_r
1636
or
cnt_dllk_zqinit_done_r
or
cnt_init_af_done_r
1637
or
cnt_init_mr_done_r
or
phy_ctl_ready
or
phy_ctl_full
1638
or
stg1_wr_done
or
rdlvl_last_byte_done
1639
or
phy_cmd_full
or
num_reads
or
rnk_ref_cnt
or
mpr_last_byte_done
1640
or
oclk_wr_cnt
or
mpr_rdlvl_done
or
mpr_rnk_done
or
num_refresh
1641
or
oclkdelay_calib_done
or
oclk_prech_req
or
oclk_calib_resume
1642
or
wrlvl_byte_redo
or
wrlvl_byte_done
or
wrlvl_final
or
wrlvl_final_r
1643
or
cnt_init_pre_wait_done_r
or
cnt_pwron_cke_done_r
1644
or
delay_incdec_done
or
wrcal_wr_cnt
1645
or
ck_addr_cmd_delay_done
or
wrcal_read_req
or
wrcal_reads
or
cnt_wrcal_rd
1646
or
wrcal_act_req
or
temp_wrcal_done
or
temp_lmr_done
1647
or
cnt_txpr_done_r
or
ddr2_pre_flag_r
1648
or
ddr2_refresh_flag_r
or
ddr3_lm_done_r
1649
or
init_state_r
or
mem_init_done_r
or
dqsfound_retry
or
dqs_found_prech_req
1650
or
prech_req_posedge_r
or
prech_req_r
or
wrcal_done
or
wrcal_resume_r
1651
or
rdlvl_stg1_done
or
rdlvl_stg1_done_r1
or
rdlvl_stg1_rank_done
or
rdlvl_stg1_start_int
1652
or
prbs_rdlvl_done
or
prbs_last_byte_done
or
prbs_rdlvl_done_r1
1653
or
stg1_wr_rd_cnt
or
rdlvl_prech_req
or
wrcal_prech_req
1654
or
read_calib_int
or
read_calib_r
or
pi_calib_done_r1
1655
or
pi_phase_locked_all_r3
or
pi_phase_locked_all_r4
1656
or
pi_dqs_found_done
or
pi_dqs_found_rank_done
or
pi_dqs_found_start
1657
or
reg_ctrl_cnt_r
or
wrlvl_done_r1
or
wrlvl_rank_done_r7
1658
or
wrcal_final_chk
or
wrcal_sanity_chk_done
)
begin
1659
init_next_state
=
init_state_r
;
1660
(*
full_case
,
parallel_case
*)
case
(
init_state_r
)
1661
1662
//*******************************************************
1663
// DRAM initialization
1664
//*******************************************************
1665
1666
// Initial state - wait for:
1667
// 1. Power-on delays to pass
1668
// 2. PHY Control Block to assert phy_ctl_ready
1669
// 3. PHY Control FIFO must not be FULL
1670
// 4. Read path initialization to finish
1671
INIT_IDLE
:
1672
if
(
cnt_pwron_cke_done_r
&&
phy_ctl_ready
&&
ck_addr_cmd_delay_done
&&
delay_incdec_done
1673
&& ~(
phy_ctl_full
||
phy_cmd_full
) )
begin
1674
// If skipping memory initialization (simulation only)
1675
if
(
SIM_INIT_OPTION
==
"SKIP_INIT"
)
1676
//if (WRLVL == "ON")
1677
// Proceed to write leveling
1678
// init_next_state = INIT_WRLVL_START;
1679
//else //if (SIM_CAL_OPTION != "SKIP_CAL")
1680
// Proceed to Phaser_In phase lock
1681
init_next_state
=
INIT_RDLVL_ACT
;
1682
// else
1683
// Skip read leveling
1684
//init_next_state = INIT_DONE;
1685
else
1686
init_next_state
=
INIT_WAIT_CKE_EXIT
;
1687
end
1688
1689
// Wait minimum of Reset CKE exit time (tXPR = max(tXS,
1690
INIT_WAIT_CKE_EXIT
:
1691
if
((
cnt_txpr_done_r
) && (
DRAM_TYPE
==
"DDR3"
)
1692
&& ~(
phy_ctl_full
||
phy_cmd_full
))
begin
1693
if
((
REG_CTRL
==
"ON"
) && ((
nCS_PER_RANK
>
1
) ||
1694
(
RANKS
>
1
)))
1695
//register write for reg dimm. Some register chips
1696
// have the register chip in a pre-programmed state
1697
// in that case the nCS_PER_RANK == 1 && RANKS == 1
1698
init_next_state
=
INIT_REG_WRITE
;
1699
else
1700
// Load mode register - this state is repeated multiple times
1701
init_next_state
=
INIT_LOAD_MR
;
1702
end
else
if
((
cnt_init_pre_wait_done_r
) && (
DRAM_TYPE
==
"DDR2"
)
1703
&& ~(
phy_ctl_full
||
phy_cmd_full
))
1704
// DDR2 start with a precharge all command
1705
init_next_state
=
INIT_DDR2_PRECHARGE
;
1706
1707
INIT_REG_WRITE
:
1708
init_next_state
=
INIT_REG_WRITE_WAIT
;
1709
1710
INIT_REG_WRITE_WAIT
:
1711
if
(
cnt_cmd_done_r
&& ~(
phy_ctl_full
||
phy_cmd_full
))
begin
1712
if
(
reg_ctrl_cnt_r
==
3'd5
)
1713
init_next_state
=
INIT_LOAD_MR
;
1714
else
1715
init_next_state
=
INIT_REG_WRITE
;
1716
end
1717
1718
INIT_LOAD_MR
:
1719
init_next_state
=
INIT_LOAD_MR_WAIT
;
1720
// After loading MR, wait at least tMRD
1721
1722
INIT_LOAD_MR_WAIT
:
1723
if
(
cnt_cmd_done_r
&& ~(
phy_ctl_full
||
phy_cmd_full
))
begin
1724
// If finished loading all mode registers, proceed to next step
1725
if
(
prbs_rdlvl_done
&&
pi_dqs_found_done
&&
rdlvl_stg1_done
)
1726
// for ddr3 when the correct burst length is writtern at end
1727
init_next_state
=
INIT_PRECHARGE
;
1728
else
if
(~
wrcal_done
&&
temp_lmr_done
)
1729
init_next_state
=
INIT_PRECHARGE_PREWAIT
;
1730
else
if
(
cnt_init_mr_done_r
)
begin
1731
if
(
DRAM_TYPE
==
"DDR3"
)
1732
init_next_state
=
INIT_ZQCL
;
1733
else
begin
//DDR2
1734
if
(
ddr2_refresh_flag_r
)
begin
1735
// memory initialization per rank for multi-rank case
1736
if
(!
mem_init_done_r
&& (
chip_cnt_r
<=
RANKS
-
1
))
1737
init_next_state
=
INIT_DDR2_MULTI_RANK
;
1738
else
1739
init_next_state
=
INIT_RDLVL_ACT
;
1740
// ddr2 initialization done.load mode state after refresh
1741
end
else
1742
init_next_state
=
INIT_DDR2_PRECHARGE
;
1743
end
1744
end
else
1745
init_next_state
=
INIT_LOAD_MR
;
1746
end
1747
1748
// DDR2 multi rank transition state
1749
INIT_DDR2_MULTI_RANK
:
1750
init_next_state
=
INIT_DDR2_MULTI_RANK_WAIT
;
1751
1752
INIT_DDR2_MULTI_RANK_WAIT
:
1753
init_next_state
=
INIT_DDR2_PRECHARGE
;
1754
1755
// Initial ZQ calibration
1756
INIT_ZQCL
:
1757
init_next_state
=
INIT_WAIT_DLLK_ZQINIT
;
1758
1759
// Wait until both DLL have locked, and ZQ calibration done
1760
INIT_WAIT_DLLK_ZQINIT
:
1761
if
(
cnt_dllk_zqinit_done_r
&& ~(
phy_ctl_full
||
phy_cmd_full
))
1762
// memory initialization per rank for multi-rank case
1763
if
(!
mem_init_done_r
&& (
chip_cnt_r
<=
RANKS
-
1
))
1764
init_next_state
=
INIT_LOAD_MR
;
1765
//else if (WRLVL == "ON")
1766
// init_next_state = INIT_WRLVL_START;
1767
else
1768
// skip write-leveling (e.g. for DDR2 interface)
1769
init_next_state
=
INIT_RDLVL_ACT
;
1770
1771
// Initial precharge for DDR2
1772
INIT_DDR2_PRECHARGE
:
1773
init_next_state
=
INIT_DDR2_PRECHARGE_WAIT
;
1774
1775
INIT_DDR2_PRECHARGE_WAIT
:
1776
if
(
cnt_cmd_done_r
&& ~(
phy_ctl_full
||
phy_cmd_full
))
begin
1777
if
(
ddr2_pre_flag_r
)
1778
init_next_state
=
INIT_REFRESH
;
1779
else
// from precharge state initially go to load mode
1780
init_next_state
=
INIT_LOAD_MR
;
1781
end
1782
1783
INIT_REFRESH
:
1784
if
((
RANKS
==
2
) && (
chip_cnt_r
==
RANKS
-
1
))
1785
init_next_state
=
INIT_REFRESH_RNK2_WAIT
;
1786
else
1787
init_next_state
=
INIT_REFRESH_WAIT
;
1788
1789
INIT_REFRESH_RNK2_WAIT
:
1790
if
(
cnt_cmd_done_r
&& ~(
phy_ctl_full
||
phy_cmd_full
))
1791
init_next_state
=
INIT_PRECHARGE
;
1792
1793
INIT_REFRESH_WAIT
:
1794
if
(
cnt_cmd_done_r
&& ~(
phy_ctl_full
||
phy_cmd_full
))
begin
1795
if
(
cnt_init_af_done_r
&& (~
mem_init_done_r
))
1796
// go to lm state as part of DDR2 init sequence
1797
init_next_state
=
INIT_LOAD_MR
;
1798
else
if
(
pi_dqs_found_done
&& ~
wrlvl_done_r1
&& ~
wrlvl_final
&& ~
wrlvl_byte_redo
&& (
WRLVL
==
"ON"
))
1799
init_next_state
=
INIT_WRLVL_START
;
1800
else
if
(~
pi_dqs_found_done
||
1801
(
rdlvl_stg1_done
&& ~
prbs_rdlvl_done
) ||
1802
((
CLK_PERIOD
/
nCK_PER_CLK
<=
2500
) &&
wrcal_done
&& ~
rdlvl_stg1_done
) ||
1803
((
CLK_PERIOD
/
nCK_PER_CLK
>
2500
) &&
wrlvl_done_r1
&& ~
rdlvl_stg1_done
))
begin
1804
if
(
num_refresh
==
'd8
)
1805
init_next_state
=
INIT_RDLVL_ACT
;
1806
else
1807
init_next_state
=
INIT_REFRESH
;
1808
end
else
if
((~
wrcal_done
&&
wrlvl_byte_redo
)&& (
DRAM_TYPE
==
"DDR3"
)
1809
&& (
CLK_PERIOD
/
nCK_PER_CLK
>
2500
))
1810
init_next_state
=
INIT_WRLVL_LOAD_MR2
;
1811
else
if
(((
prbs_rdlvl_done
&&
rdlvl_stg1_done
&&
pi_dqs_found_done
) && (
WRLVL
==
"ON"
))
1812
&&
mem_init_done_r
&& (
CLK_PERIOD
/
nCK_PER_CLK
>
2500
))
1813
init_next_state
=
INIT_WRCAL_ACT
;
1814
else
if
(
pi_dqs_found_done
&& (
DRAM_TYPE
==
"DDR3"
) && ~(
mpr_last_byte_done
||
mpr_rdlvl_done
))
begin
1815
if
(
num_refresh
==
'd8
)
1816
init_next_state
=
INIT_MPR_RDEN
;
1817
else
1818
init_next_state
=
INIT_REFRESH
;
1819
end
else
if
(((~
oclkdelay_calib_done
&&
wrlvl_final
) ||
1820
(~
wrcal_done
&&
wrlvl_byte_redo
)) && (
DRAM_TYPE
==
"DDR3"
))
1821
init_next_state
=
INIT_WRLVL_LOAD_MR2
;
1822
else
if
(~
oclkdelay_calib_done
&& (
mpr_last_byte_done
||
mpr_rdlvl_done
) && (
DRAM_TYPE
==
"DDR3"
))
begin
1823
if
(
num_refresh
==
'd8
)
1824
init_next_state
=
INIT_OCLKDELAY_ACT
;
1825
else
1826
init_next_state
=
INIT_REFRESH
;
1827
end
else
if
((~
wrcal_done
&& (
WRLVL
==
"ON"
) && (
CLK_PERIOD
/
nCK_PER_CLK
<=
2500
))
1828
&&
pi_dqs_found_done
)
1829
init_next_state
=
INIT_WRCAL_ACT
;
1830
else
if
(
mem_init_done_r
)
begin
1831
if
(
RANKS
<
2
)
1832
init_next_state
=
INIT_RDLVL_ACT
;
1833
else
if
(
stg1_wr_done
&& ~
rnk_ref_cnt
&& ~
rdlvl_stg1_done
)
1834
init_next_state
=
INIT_PRECHARGE
;
1835
else
1836
init_next_state
=
INIT_RDLVL_ACT
;
1837
end
else
// to DDR2 init state as part of DDR2 init sequence
1838
init_next_state
=
INIT_REFRESH
;
1839
end
1840
1841
//******************************************************
1842
// Write Leveling
1843
//*******************************************************
1844
1845
// Enable write leveling in MR1 and start write leveling
1846
// for current rank
1847
INIT_WRLVL_START
:
1848
init_next_state
=
INIT_WRLVL_WAIT
;
1849
1850
// Wait for both MR load and write leveling to complete
1851
// (write leveling should take much longer than MR load..)
1852
INIT_WRLVL_WAIT
:
1853
if
(
wrlvl_rank_done_r7
&& ~(
phy_ctl_full
||
phy_cmd_full
))
1854
init_next_state
=
INIT_WRLVL_LOAD_MR
;
1855
1856
// Disable write leveling in MR1 for current rank
1857
INIT_WRLVL_LOAD_MR
:
1858
init_next_state
=
INIT_WRLVL_LOAD_MR_WAIT
;
1859
1860
INIT_WRLVL_LOAD_MR_WAIT
:
1861
if
(
cnt_cmd_done_r
&& ~(
phy_ctl_full
||
phy_cmd_full
))
1862
init_next_state
=
INIT_WRLVL_LOAD_MR2
;
1863
1864
// Load MR2 to set ODT: Dynamic ODT for single rank case
1865
// And ODTs for multi-rank case as well
1866
INIT_WRLVL_LOAD_MR2
:
1867
init_next_state
=
INIT_WRLVL_LOAD_MR2_WAIT
;
1868
1869
// Wait tMRD before proceeding
1870
INIT_WRLVL_LOAD_MR2_WAIT
:
1871
if
(
cnt_cmd_done_r
&& ~(
phy_ctl_full
||
phy_cmd_full
))
begin
1872
//if (wrlvl_byte_done)
1873
// init_next_state = INIT_PRECHARGE_PREWAIT;
1874
// else if ((RANKS == 2) && wrlvl_rank_done_r2)
1875
// init_next_state = INIT_WRLVL_LOAD_MR2_WAIT;
1876
if
(~
wrlvl_done_r1
)
1877
init_next_state
=
INIT_WRLVL_START
;
1878
else
if
(
SIM_CAL_OPTION
==
"SKIP_CAL"
)
1879
// If skip rdlvl, then we're done
1880
init_next_state
=
INIT_DONE
;
1881
else
1882
// Otherwise, proceed to read leveling
1883
//init_next_state = INIT_RDLVL_ACT;
1884
init_next_state
=
INIT_PRECHARGE_PREWAIT
;
1885
end
1886
1887
//*******************************************************
1888
// Read Leveling
1889
//*******************************************************
1890
1891
// single row activate. All subsequent read leveling writes and
1892
// read will take place in this row
1893
INIT_RDLVL_ACT
:
1894
init_next_state
=
INIT_RDLVL_ACT_WAIT
;
1895
1896
// hang out for awhile before issuing subsequent column commands
1897
// it's also possible to reach this state at various points
1898
// during read leveling - determine what the current stage is
1899
INIT_RDLVL_ACT_WAIT
:
1900
if
(
cnt_cmd_done_r
&& ~(
phy_ctl_full
||
phy_cmd_full
))
begin
1901
// Just finished an activate. Now either write, read, or precharge
1902
// depending on where we are in the training sequence
1903
if
(!
pi_calib_done_r1
)
1904
init_next_state
=
INIT_PI_PHASELOCK_READS
;
1905
else
if
(!
pi_dqs_found_done
)
1906
// (!pi_dqs_found_start || pi_dqs_found_rank_done))
1907
init_next_state
=
INIT_RDLVL_STG2_READ
;
1908
else
if
(~
wrcal_done
&& (
WRLVL
==
"ON"
) && (
CLK_PERIOD
/
nCK_PER_CLK
<=
2500
))
1909
init_next_state
=
INIT_WRCAL_ACT_WAIT
;
1910
else
if
((!
rdlvl_stg1_done
&& ~
stg1_wr_done
&& ~
rdlvl_last_byte_done
) ||
1911
(!
prbs_rdlvl_done
&& ~
stg1_wr_done
&& ~
prbs_last_byte_done
))
begin
1912
// Added to avoid rdlvl_stg1 write data pattern at the start of PRBS rdlvl
1913
if
(!
prbs_rdlvl_done
&& ~
stg1_wr_done
&&
rdlvl_last_byte_done
)
1914
init_next_state
=
INIT_RDLVL_ACT_WAIT
;
1915
else
1916
init_next_state
=
INIT_RDLVL_STG1_WRITE
;
1917
end
else
if
((!
rdlvl_stg1_done
&&
rdlvl_stg1_start_int
) || !
prbs_rdlvl_done
)
begin
1918
if
(
rdlvl_last_byte_done
||
prbs_last_byte_done
)
1919
// Added to avoid extra reads at the end of read leveling
1920
init_next_state
=
INIT_RDLVL_ACT_WAIT
;
1921
else
1922
// Case 2: If in stage 1, and just precharged after training
1923
// previous byte, then continue reading
1924
init_next_state
=
INIT_RDLVL_STG1_READ
;
1925
end
else
if
((
prbs_rdlvl_done
&&
rdlvl_stg1_done
&& (
RANKS
==
1
)) && (
WRLVL
==
"ON"
) &&
1926
(
CLK_PERIOD
/
nCK_PER_CLK
>
2500
))
1927
init_next_state
=
INIT_WRCAL_ACT_WAIT
;
1928
else
1929
// Otherwise, if we're finished with calibration, then precharge
1930
// the row - silly, because we just opened it - possible to take
1931
// this out by adding logic to avoid the ACT in first place. Make
1932
// sure that cnt_cmd_done will handle tRAS(min)
1933
init_next_state
=
INIT_PRECHARGE_PREWAIT
;
1934
end
1935
1936
//**************************************************
1937
// Back-to-back reads for Phaser_IN Phase locking
1938
// DQS to FREQ_REF clock
1939
//**************************************************
1940
1941
INIT_PI_PHASELOCK_READS
:
1942
if
(
pi_phase_locked_all_r3
&& ~
pi_phase_locked_all_r4
)
1943
init_next_state
=
INIT_PRECHARGE_PREWAIT
;
1944
1945
//*********************************************
1946
// Stage 1 read-leveling (write and continuous read)
1947
//*********************************************
1948
1949
// Write training pattern for stage 1
1950
// PRBS pattern of TBD length
1951
INIT_RDLVL_STG1_WRITE
:
1952
// 4:1 DDR3 BL8 will require all 8 words in 1 DIV4 clock cycle
1953
// 2:1 DDR2/DDR3 BL8 will require 2 DIV2 clock cycles for 8 words
1954
// 2:1 DDR2 BL4 will require 1 DIV2 clock cycle for 4 words
1955
// An entire row worth of writes issued before proceeding to reads
1956
// The number of write is (2^column width)/burst length to accomodate
1957
// PRBS pattern for window detection.
1958
if
(
stg1_wr_rd_cnt
==
9'd1
)
1959
init_next_state
=
INIT_RDLVL_STG1_WRITE_READ
;
1960
1961
// Write-read turnaround
1962
INIT_RDLVL_STG1_WRITE_READ
:
1963
if
(
cnt_cmd_done_r
&& ~(
phy_ctl_full
||
phy_cmd_full
))
1964
init_next_state
=
INIT_RDLVL_STG1_READ
;
1965
1966
// Continuous read, where interruptible by precharge request from
1967
// calibration logic. Also precharges when stage 1 is complete
1968
// No precharges when reads provided to Phaser_IN for phase locking
1969
// FREQ_REF to read DQS since data integrity is not important.
1970
INIT_RDLVL_STG1_READ
:
1971
if
(
rdlvl_stg1_rank_done
|| (
rdlvl_stg1_done
&& ~
rdlvl_stg1_done_r1
) ||
1972
prech_req_posedge_r
|| (
prbs_rdlvl_done
&& ~
prbs_rdlvl_done_r1
))
1973
init_next_state
=
INIT_PRECHARGE_PREWAIT
;
1974
1975
//*********************************************
1976
// DQSFOUND calibration (set of 4 reads with gaps)
1977
//*********************************************
1978
1979
// Read of training data. Note that Stage 2 is not a constant read,
1980
// instead there is a large gap between each set of back-to-back reads
1981
INIT_RDLVL_STG2_READ
:
1982
// 4 read commands issued back-to-back
1983
if
(
num_reads
==
'b1
)
1984
init_next_state
=
INIT_RDLVL_STG2_READ_WAIT
;
1985
1986
// Wait before issuing the next set of reads. If a precharge request
1987
// comes in then handle - this can occur after stage 2 calibration is
1988
// completed for a DQS group
1989
INIT_RDLVL_STG2_READ_WAIT
:
1990
if
(~(
phy_ctl_full
||
phy_cmd_full
))
begin
1991
if
(
pi_dqs_found_rank_done
||
1992
pi_dqs_found_done
||
prech_req_posedge_r
)
1993
init_next_state
=
INIT_PRECHARGE_PREWAIT
;
1994
else
if
(
cnt_cmd_done_r
)
1995
init_next_state
=
INIT_RDLVL_STG2_READ
;
1996
end
1997
1998
1999
//******************************************************************
2000
// MPR Read Leveling for DDR3 OCLK_DELAYED calibration
2001
//******************************************************************
2002
2003
// Issue Load Mode Register 3 command with A[2]=1, A[1:0]=2'b00
2004
// to enable Multi Purpose Register (MPR) Read
2005
INIT_MPR_RDEN
:
2006
init_next_state
=
INIT_MPR_WAIT
;
2007
2008
//Wait tMRD, tMOD
2009
INIT_MPR_WAIT
:
2010
if
(
cnt_cmd_done_r
)
begin
2011
init_next_state
=
INIT_MPR_READ
;
2012
end
2013
2014
// Issue back-to-back read commands to read from MPR with
2015
// Address bus 0x0000 for BL=8. DQ[0] will output the pre-defined
2016
// MPR pattern of 01010101 (Rise0 = 1'b0, Fall0 = 1'b1 ...)
2017
INIT_MPR_READ
:
2018
if
(
mpr_rdlvl_done
||
mpr_rnk_done
||
rdlvl_prech_req
)
2019
init_next_state
=
INIT_MPR_DISABLE_PREWAIT
;
2020
2021
INIT_MPR_DISABLE_PREWAIT
:
2022
if
(
cnt_cmd_done_r
)
2023
init_next_state
=
INIT_MPR_DISABLE
;
2024
2025
// Issue Load Mode Register 3 command with A[2]=0 to disable
2026
// MPR read
2027
INIT_MPR_DISABLE
:
2028
init_next_state
=
INIT_MPR_DISABLE_WAIT
;
2029
2030
INIT_MPR_DISABLE_WAIT
:
2031
init_next_state
=
INIT_PRECHARGE_PREWAIT
;
2032
2033
2034
//***********************************************************************
2035
// OCLKDELAY Calibration
2036
//***********************************************************************
2037
2038
// This calibration requires single write followed by single read to
2039
// determine the Phaser_Out stage 3 delay required to center write DQS
2040
// in write DQ valid window.
2041
2042
// Single Row Activate command before issuing Write command
2043
INIT_OCLKDELAY_ACT
:
2044
init_next_state
=
INIT_OCLKDELAY_ACT_WAIT
;
2045
2046
INIT_OCLKDELAY_ACT_WAIT
:
2047
if
(
cnt_cmd_done_r
&& ~
oclk_prech_req
)
2048
init_next_state
=
INIT_OCLKDELAY_WRITE
;
2049
else
if
(
oclkdelay_calib_done
||
prech_req_posedge_r
)
2050
init_next_state
=
INIT_PRECHARGE_PREWAIT
;
2051
2052
INIT_OCLKDELAY_WRITE
:
2053
if
(
oclk_wr_cnt
==
4'd1
)
2054
init_next_state
=
INIT_OCLKDELAY_WRITE_WAIT
;
2055
2056
INIT_OCLKDELAY_WRITE_WAIT
:
2057
if
(
cnt_cmd_done_r
&& ~(
phy_ctl_full
||
phy_cmd_full
))
2058
init_next_state
=
INIT_OCLKDELAY_READ
;
2059
2060
INIT_OCLKDELAY_READ
:
2061
init_next_state
=
INIT_OCLKDELAY_READ_WAIT
;
2062
2063
INIT_OCLKDELAY_READ_WAIT
:
2064
if
(~(
phy_ctl_full
||
phy_cmd_full
))
begin
2065
if
(
oclk_calib_resume
)
2066
init_next_state
=
INIT_OCLKDELAY_WRITE
;
2067
else
if
(
oclkdelay_calib_done
||
prech_req_posedge_r
||
2068
wrlvl_final
)
2069
init_next_state
=
INIT_PRECHARGE_PREWAIT
;
2070
end
2071
2072
2073
//*********************************************
2074
// Write calibration
2075
//*********************************************
2076
2077
// single row activate
2078
INIT_WRCAL_ACT
:
2079
init_next_state
=
INIT_WRCAL_ACT_WAIT
;
2080
2081
// hang out for awhile before issuing subsequent column command
2082
INIT_WRCAL_ACT_WAIT
:
2083
if
(
cnt_cmd_done_r
&& ~
wrcal_prech_req
)
2084
init_next_state
=
INIT_WRCAL_WRITE
;
2085
else
if
(
wrcal_done
||
prech_req_posedge_r
)
2086
init_next_state
=
INIT_PRECHARGE_PREWAIT
;
2087
2088
// Write training pattern for write calibration
2089
INIT_WRCAL_WRITE
:
2090
// Once we've issued enough commands for 8 words - proceed to reads
2091
//if (burst_addr_r == 1'b1)
2092
if
(
wrcal_wr_cnt
==
4'd1
)
2093
init_next_state
=
INIT_WRCAL_WRITE_READ
;
2094
2095
// Write-read turnaround
2096
INIT_WRCAL_WRITE_READ
:
2097
if
(
cnt_cmd_done_r
&& ~(
phy_ctl_full
||
phy_cmd_full
))
2098
init_next_state
=
INIT_WRCAL_READ
;
2099
else
if
(
dqsfound_retry
)
2100
init_next_state
=
INIT_RDLVL_STG2_READ_WAIT
;
2101
2102
2103
INIT_WRCAL_READ
:
2104
if
(
burst_addr_r
==
1'b1
)
2105
init_next_state
=
INIT_WRCAL_READ_WAIT
;
2106
2107
INIT_WRCAL_READ_WAIT
:
2108
if
(~(
phy_ctl_full
||
phy_cmd_full
))
begin
2109
if
(
wrcal_resume_r
)
begin
2110
if
(
wrcal_final_chk
)
2111
init_next_state
=
INIT_WRCAL_READ
;
2112
else
2113
init_next_state
=
INIT_WRCAL_WRITE
;
2114
end
else
if
(
wrcal_done
||
prech_req_posedge_r
||
wrcal_act_req
||
2115
// Added to support PO fine delay inc when TG errors
2116
wrlvl_byte_redo
|| (
temp_wrcal_done
&& ~
temp_lmr_done
))
2117
init_next_state
=
INIT_PRECHARGE_PREWAIT
;
2118
else
if
(
dqsfound_retry
)
2119
init_next_state
=
INIT_RDLVL_STG2_READ_WAIT
;
2120
else
if
(
wrcal_read_req
&&
cnt_wrcal_rd
)
2121
init_next_state
=
INIT_WRCAL_MULT_READS
;
2122
end
2123
2124
INIT_WRCAL_MULT_READS
:
2125
// multiple read commands issued back-to-back
2126
if
(
wrcal_reads
==
'b1
)
2127
init_next_state
=
INIT_WRCAL_READ_WAIT
;
2128
2129
//*********************************************
2130
// Handling of precharge during and in between read-level stages
2131
//*********************************************
2132
2133
// Make sure we aren't violating any timing specs by precharging
2134
// immediately
2135
INIT_PRECHARGE_PREWAIT
:
2136
if
(
cnt_cmd_done_r
&& ~(
phy_ctl_full
||
phy_cmd_full
))
2137
init_next_state
=
INIT_PRECHARGE
;
2138
2139
// Initiate precharge
2140
INIT_PRECHARGE
:
2141
init_next_state
=
INIT_PRECHARGE_WAIT
;
2142
2143
INIT_PRECHARGE_WAIT
:
2144
if
(
cnt_cmd_done_r
&& ~(
phy_ctl_full
||
phy_cmd_full
))
begin
2145
if
((
wrcal_sanity_chk_done
&& (
DRAM_TYPE
==
"DDR3"
)) ||
2146
(
rdlvl_stg1_done
&&
prbs_rdlvl_done
&&
pi_dqs_found_done
&&
2147
(
DRAM_TYPE
==
"DDR2"
)))
2148
init_next_state
=
INIT_DONE
;
2149
else
if
((
wrcal_done
|| (
WRLVL
==
"OFF"
)) &&
rdlvl_stg1_done
&&
prbs_rdlvl_done
&&
2150
pi_dqs_found_done
&& ((
ddr3_lm_done_r
) || (
DRAM_TYPE
==
"DDR2"
)))
2151
// If read leveling and phase detection calibration complete,
2152
// and programing the correct burst length then we're finished
2153
init_next_state
=
INIT_WRCAL_ACT
;
2154
else
if
((
wrcal_done
|| (
WRLVL
==
"OFF"
) || (~
wrcal_done
&&
temp_wrcal_done
&& ~
temp_lmr_done
))
2155
&& (
rdlvl_stg1_done
|| (~
wrcal_done
&&
temp_wrcal_done
&& ~
temp_lmr_done
))
2156
&&
prbs_rdlvl_done
&&
rdlvl_stg1_done
&&
pi_dqs_found_done
)
begin
2157
// after all calibration program the correct burst length
2158
init_next_state
=
INIT_LOAD_MR
;
2159
// Added to support PO fine delay inc when TG errors
2160
end
else
if
(~
wrcal_done
&&
temp_wrcal_done
&&
temp_lmr_done
)
2161
init_next_state
=
INIT_WRCAL_READ_WAIT
;
2162
else
if
(
rdlvl_stg1_done
&&
pi_dqs_found_done
&& (
WRLVL
==
"ON"
))
2163
// If read leveling finished, proceed to write calibration
2164
init_next_state
=
INIT_REFRESH
;
2165
else
2166
// Otherwise, open row for read-leveling purposes
2167
init_next_state
=
INIT_REFRESH
;
2168
end
2169
2170
//*******************************************************
2171
// Initialization/Calibration done. Take a long rest, relax
2172
//*******************************************************
2173
2174
INIT_DONE
:
2175
init_next_state
=
INIT_DONE
;
2176
2177
endcase
2178
end
2179
2180
//*****************************************************************
2181
// Initialization done signal - asserted before leveling starts
2182
//*****************************************************************
2183
2184
2185
always
@(
posedge
clk
)
2186
if
(
rst
)
2187
mem_init_done_r
<= #TCQ
1'b0
;
2188
else
if
((!
cnt_dllk_zqinit_done_r
&&
2189
(
cnt_dllk_zqinit_r
==
TDLLK_TZQINIT_DELAY_CNT
) &&
2190
(
chip_cnt_r
==
RANKS
-
1
) && (
DRAM_TYPE
==
"DDR3"
))
2191
|| ( (
init_state_r
==
INIT_LOAD_MR_WAIT
) &&
2192
(
ddr2_refresh_flag_r
) && (
chip_cnt_r
==
RANKS
-
1
)
2193
&& (
cnt_init_mr_done_r
) && (
DRAM_TYPE
==
"DDR2"
)))
2194
mem_init_done_r
<= #TCQ
1'b1
;
2195
2196
//*****************************************************************
2197
// Write Calibration signal to PHY Control Block - asserted before
2198
// Write Leveling starts
2199
//*****************************************************************
2200
2201
//generate
2202
//if (RANKS < 2) begin: ranks_one
2203
always
@(
posedge
clk
)
begin
2204
if
(
rst
|| (
done_dqs_tap_inc
&&
2205
(
init_state_r
==
INIT_WRLVL_LOAD_MR2
)))
2206
write_calib
<= #TCQ
1'b0
;
2207
else
if
(
wrlvl_active_r1
)
2208
write_calib
<= #TCQ
1'b1
;
2209
end
2210
//end else begin: ranks_two
2211
// always @(posedge clk) begin
2212
// if (rst ||
2213
// ((init_state_r1 == INIT_WRLVL_LOAD_MR_WAIT) &&
2214
// ((wrlvl_rank_done_r2 && (chip_cnt_r == RANKS-1)) ||
2215
// (SIM_CAL_OPTION == "FAST_CAL"))))
2216
// write_calib <= #TCQ 1'b0;
2217
// else if (wrlvl_active_r1)
2218
// write_calib <= #TCQ 1'b1;
2219
// end
2220
//end
2221
//endgenerate
2222
2223
//*****************************************************************
2224
// Read Calibration signal to PHY Control Block - asserted after
2225
// Write Leveling during PHASER_IN phase locking stage.
2226
// Must be de-asserted before Read Leveling
2227
//*****************************************************************
2228
2229
always
@(
posedge
clk
)
begin
2230
if
(
rst
||
pi_calib_done_r1
)
2231
read_calib_int
<= #TCQ
1'b0
;
2232
else
if
(~
pi_calib_done_r1
&& (
init_state_r
==
INIT_RDLVL_ACT_WAIT
) &&
2233
(
cnt_cmd_r
==
CNTNEXT_CMD
))
2234
read_calib_int
<= #TCQ
1'b1
;
2235
end
2236
2237
always
@(
posedge
clk
)
2238
read_calib_r
<= #TCQ
read_calib_int
;
2239
2240
2241
always
@(
posedge
clk
)
begin
2242
if
(
rst
||
pi_calib_done_r1
)
2243
read_calib
<= #TCQ
1'b0
;
2244
else
if
(~
pi_calib_done_r1
&& (
init_state_r
==
INIT_PI_PHASELOCK_READS
))
2245
read_calib
<= #TCQ
1'b1
;
2246
end
2247
2248
2249
always
@(
posedge
clk
)
2250
if
(
rst
)
2251
pi_calib_done_r
<= #TCQ
1'b0
;
2252
else
if
(
pi_calib_rank_done_r
)
// && (chip_cnt_r == RANKS-1))
2253
pi_calib_done_r
<= #TCQ
1'b1
;
2254
2255
always
@(
posedge
clk
)
2256
if
(
rst
)
2257
pi_calib_rank_done_r
<= #TCQ
1'b0
;
2258
else
if
(
pi_phase_locked_all_r3
&& ~
pi_phase_locked_all_r4
)
2259
pi_calib_rank_done_r
<= #TCQ
1'b1
;
2260
else
2261
pi_calib_rank_done_r
<= #TCQ
1'b0
;
2262
2263
always
@(
posedge
clk
)
begin
2264
if
(
rst
|| ((
PRE_REV3ES
==
"ON"
) &&
temp_wrcal_done
&& ~
temp_wrcal_done_r
))
2265
pi_phaselock_timer
<= #TCQ
'd0
;
2266
else
if
(((
init_state_r
==
INIT_PI_PHASELOCK_READS
) &&
2267
(
pi_phaselock_timer
!=
PHASELOCKED_TIMEOUT
)) ||
2268
tg_timer_go
)
2269
pi_phaselock_timer
<= #TCQ
pi_phaselock_timer
+
1
;
2270
else
2271
pi_phaselock_timer
<= #TCQ
pi_phaselock_timer
;
2272
end
2273
2274
assign
pi_phase_locked_err
= (
pi_phaselock_timer
==
PHASELOCKED_TIMEOUT
) ?
1'b1
:
1'b0
;
2275
2276
//*****************************************************************
2277
// DDR3 final burst length programming done. For DDR3 during
2278
// calibration the burst length is fixed to BL8. After calibration
2279
// the correct burst length is programmed.
2280
//*****************************************************************
2281
always
@(
posedge
clk
)
2282
if
(
rst
)
2283
ddr3_lm_done_r
<= #TCQ
1'b0
;
2284
else
if
((
init_state_r
==
INIT_LOAD_MR_WAIT
) &&
2285
(
chip_cnt_r
==
RANKS
-
1
) &&
wrcal_done
)
2286
ddr3_lm_done_r
<= #TCQ
1'b1
;
2287
2288
always
@(
posedge
clk
)
begin
2289
pi_dqs_found_rank_done_r
<= #TCQ
pi_dqs_found_rank_done
;
2290
pi_phase_locked_all_r1
<= #TCQ
pi_phase_locked_all
;
2291
pi_phase_locked_all_r2
<= #TCQ
pi_phase_locked_all_r1
;
2292
pi_phase_locked_all_r3
<= #TCQ
pi_phase_locked_all_r2
;
2293
pi_phase_locked_all_r4
<= #TCQ
pi_phase_locked_all_r3
;
2294
pi_dqs_found_all_r
<= #TCQ
pi_dqs_found_done
;
2295
pi_calib_done_r1
<= #TCQ
pi_calib_done_r
;
2296
end
2297
2298
//***************************************************************************
2299
// Logic for deep memory (multi-rank) configurations
2300
//***************************************************************************
2301
2302
// For DDR3 asserted when
2303
2304
generate
2305
if
(
RANKS
<
2
)
begin
:
single_rank
2306
always
@(
posedge
clk
)
2307
chip_cnt_r
<= #TCQ
2'b00
;
2308
end
else
begin
:
dual_rank
2309
always
@(
posedge
clk
)
2310
if
(
rst
||
2311
// Set chip_cnt_r to 2'b00 after both Ranks are read leveled
2312
(
rdlvl_stg1_done
&&
prbs_rdlvl_done
&& ~
wrcal_done
) ||
2313
// Set chip_cnt_r to 2'b00 after both Ranks are write leveled
2314
(
wrlvl_done_r
&&
2315
(
init_state_r
==
INIT_WRLVL_LOAD_MR2_WAIT
)))
begin
2316
chip_cnt_r
<= #TCQ
2'b00
;
2317
end
else
if
((((
init_state_r
==
INIT_WAIT_DLLK_ZQINIT
) &&
2318
(
cnt_dllk_zqinit_r
==
TDLLK_TZQINIT_DELAY_CNT
)) &&
2319
(
DRAM_TYPE
==
"DDR3"
)) ||
2320
((
init_state_r
==
INIT_REFRESH_RNK2_WAIT
) &&
2321
(
cnt_cmd_r
==
'd36
)) ||
2322
//mpr_rnk_done ||
2323
//(rdlvl_stg1_rank_done && ~rdlvl_last_byte_done) ||
2324
//(stg1_wr_done && (init_state_r == INIT_REFRESH) &&
2325
//~(rnk_ref_cnt && rdlvl_last_byte_done)) ||
2326
2327
// Increment chip_cnt_r to issue Refresh to second rank
2328
(~
pi_dqs_found_all_r
&&
2329
(
init_state_r
==
INIT_PRECHARGE_PREWAIT
) &&
2330
(
cnt_cmd_r
==
'd36
)) ||
2331
2332
// Increment chip_cnt_r when DQSFOUND done for the Rank
2333
(
pi_dqs_found_rank_done
&& ~
pi_dqs_found_rank_done_r
) ||
2334
((
init_state_r
==
INIT_LOAD_MR_WAIT
)&&
cnt_cmd_done_r
2335
&&
wrcal_done
) ||
2336
((
init_state_r
==
INIT_DDR2_MULTI_RANK
)
2337
&& (
DRAM_TYPE
==
"DDR2"
)))
begin
2338
if
((~
mem_init_done_r
|| ~
rdlvl_stg1_done
|| ~
pi_dqs_found_done
||
2339
// condition to increment chip_cnt during
2340
// final burst length programming for DDR3
2341
~
pi_calib_done_r
||
wrcal_done
)
//~mpr_rdlvl_done ||
2342
&& (
chip_cnt_r
!=
RANKS
-
1
))
2343
chip_cnt_r
<= #TCQ
chip_cnt_r
+
1
;
2344
else
2345
chip_cnt_r
<= #TCQ
2'b00
;
2346
end
2347
end
2348
endgenerate
2349
2350
generate
2351
if
((
REG_CTRL
==
"ON"
) && (
RANKS
==
1
))
begin
:
DDR3_RDIMM_1rank
2352
always
@(
posedge
clk
)
begin
2353
if
(
rst
)
2354
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2355
else
if
(
init_state_r
==
INIT_REG_WRITE
)
begin
2356
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2357
if
(!(
CWL_M
%
2
))
begin
2358
phy_int_cs_n
[
0
%
nCK_PER_CLK
] <= #TCQ
1'b0
;
2359
phy_int_cs_n
[
1
%
nCK_PER_CLK
] <= #TCQ
1'b0
;
2360
end
else
begin
2361
phy_int_cs_n
[
2
%
nCK_PER_CLK
] <= #TCQ
1'b0
;
2362
phy_int_cs_n
[
3
%
nCK_PER_CLK
] <= #TCQ
1'b0
;
2363
end
2364
end
else
if
((
init_state_r
==
INIT_LOAD_MR
) ||
2365
(
init_state_r
==
INIT_MPR_RDEN
) ||
2366
(
init_state_r
==
INIT_MPR_DISABLE
) ||
2367
(
init_state_r
==
INIT_WRLVL_START
) ||
2368
(
init_state_r
==
INIT_WRLVL_LOAD_MR
) ||
2369
(
init_state_r
==
INIT_WRLVL_LOAD_MR2
) ||
2370
(
init_state_r
==
INIT_ZQCL
) ||
2371
(
init_state_r
==
INIT_RDLVL_ACT
) ||
2372
(
init_state_r
==
INIT_WRCAL_ACT
) ||
2373
(
init_state_r
==
INIT_OCLKDELAY_ACT
) ||
2374
(
init_state_r
==
INIT_PRECHARGE
) ||
2375
(
init_state_r
==
INIT_DDR2_PRECHARGE
) ||
2376
(
init_state_r
==
INIT_REFRESH
) ||
2377
(
rdlvl_wr_rd
&&
new_burst_r
))
begin
2378
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2379
if
(!(
CWL_M
%
2
))
//even CWL
2380
phy_int_cs_n
[
0
] <= #TCQ
1'b0
;
2381
else
// odd CWL
2382
phy_int_cs_n
[
1
*
nCS_PER_RANK
] <= #TCQ
1'b0
;
2383
end
else
2384
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2385
end
2386
end
else
if
(
RANKS
==
1
)
begin
:
DDR3_1rank
2387
always
@(
posedge
clk
)
begin
2388
if
(
rst
)
2389
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2390
else
if
((
init_state_r
==
INIT_LOAD_MR
) ||
2391
(
init_state_r
==
INIT_MPR_RDEN
) ||
2392
(
init_state_r
==
INIT_MPR_DISABLE
) ||
2393
(
init_state_r
==
INIT_WRLVL_START
) ||
2394
(
init_state_r
==
INIT_WRLVL_LOAD_MR
) ||
2395
(
init_state_r
==
INIT_WRLVL_LOAD_MR2
) ||
2396
(
init_state_r
==
INIT_ZQCL
) ||
2397
(
init_state_r
==
INIT_RDLVL_ACT
) ||
2398
(
init_state_r
==
INIT_WRCAL_ACT
) ||
2399
(
init_state_r
==
INIT_OCLKDELAY_ACT
) ||
2400
(
init_state_r
==
INIT_PRECHARGE
) ||
2401
(
init_state_r
==
INIT_DDR2_PRECHARGE
) ||
2402
(
init_state_r
==
INIT_REFRESH
) ||
2403
(
rdlvl_wr_rd
&&
new_burst_r
))
begin
2404
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2405
if
(!(
CWL_M
%
2
))
begin
//even CWL
2406
for
(
n
=
0
;
n
<
nCS_PER_RANK
;
n
=
n
+
1
)
begin
2407
phy_int_cs_n
[
n
] <= #TCQ
1'b0
;
2408
end
2409
end
else
begin
//odd CWL
2410
for
(
p
=
nCS_PER_RANK
;
p
<
2
*
nCS_PER_RANK
;
p
=
p
+
1
)
begin
2411
phy_int_cs_n
[
p
] <= #TCQ
1'b0
;
2412
end
2413
end
2414
end
else
2415
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2416
end
2417
end
else
if
((
REG_CTRL
==
"ON"
) && (
RANKS
==
2
))
begin
:
DDR3_2rank
2418
always
@(
posedge
clk
)
begin
2419
if
(
rst
)
2420
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2421
else
if
(
init_state_r
==
INIT_REG_WRITE
)
begin
2422
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2423
if
(!(
CWL_M
%
2
))
begin
2424
phy_int_cs_n
[
0
%
nCK_PER_CLK
] <= #TCQ
1'b0
;
2425
phy_int_cs_n
[
1
%
nCK_PER_CLK
] <= #TCQ
1'b0
;
2426
end
else
begin
2427
phy_int_cs_n
[
2
%
nCK_PER_CLK
] <= #TCQ
1'b0
;
2428
phy_int_cs_n
[
3
%
nCK_PER_CLK
] <= #TCQ
1'b0
;
2429
end
2430
end
else
begin
2431
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2432
case
(
chip_cnt_r
)
2433
2'b00
:
begin
2434
if
((
init_state_r
==
INIT_LOAD_MR
) ||
2435
(
init_state_r
==
INIT_MPR_RDEN
) ||
2436
(
init_state_r
==
INIT_MPR_DISABLE
) ||
2437
(
init_state_r
==
INIT_WRLVL_START
) ||
2438
(
init_state_r
==
INIT_WRLVL_LOAD_MR
) ||
2439
(
init_state_r
==
INIT_WRLVL_LOAD_MR2
) ||
2440
(
init_state_r
==
INIT_ZQCL
) ||
2441
(
init_state_r
==
INIT_RDLVL_ACT
) ||
2442
(
init_state_r
==
INIT_WRCAL_ACT
) ||
2443
(
init_state_r
==
INIT_OCLKDELAY_ACT
) ||
2444
(
init_state_r
==
INIT_PRECHARGE
) ||
2445
(
init_state_r
==
INIT_DDR2_PRECHARGE
) ||
2446
(
init_state_r
==
INIT_REFRESH
) ||
2447
(
rdlvl_wr_rd
&&
new_burst_r
))
begin
2448
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2449
if
(!(
CWL_M
%
2
))
//even CWL
2450
phy_int_cs_n
[
0
] <= #TCQ
1'b0
;
2451
else
// odd CWL
2452
phy_int_cs_n
[
1
*
CS_WIDTH
*
nCS_PER_RANK
] <= #TCQ
1'b0
;
2453
end
else
2454
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2455
//for (n = 0; n < nCS_PER_RANK*nCK_PER_CLK*2; n = n + (nCS_PER_RANK*2)) begin
2456
//
2457
// phy_int_cs_n[n+:nCS_PER_RANK] <= #TCQ {nCS_PER_RANK{1'b0}};
2458
//end
2459
end
2460
2'b01
:
begin
2461
if
((
init_state_r
==
INIT_LOAD_MR
) ||
2462
(
init_state_r
==
INIT_MPR_RDEN
) ||
2463
(
init_state_r
==
INIT_MPR_DISABLE
) ||
2464
(
init_state_r
==
INIT_WRLVL_START
) ||
2465
(
init_state_r
==
INIT_WRLVL_LOAD_MR
) ||
2466
(
init_state_r
==
INIT_WRLVL_LOAD_MR2
) ||
2467
(
init_state_r
==
INIT_ZQCL
) ||
2468
(
init_state_r
==
INIT_RDLVL_ACT
) ||
2469
(
init_state_r
==
INIT_WRCAL_ACT
) ||
2470
(
init_state_r
==
INIT_OCLKDELAY_ACT
) ||
2471
(
init_state_r
==
INIT_PRECHARGE
) ||
2472
(
init_state_r
==
INIT_DDR2_PRECHARGE
) ||
2473
(
init_state_r
==
INIT_REFRESH
) ||
2474
(
rdlvl_wr_rd
&&
new_burst_r
))
begin
2475
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2476
if
(!(
CWL_M
%
2
))
//even CWL
2477
phy_int_cs_n
[
1
] <= #TCQ
1'b0
;
2478
else
// odd CWL
2479
phy_int_cs_n
[
1
+
1
*
CS_WIDTH
*
nCS_PER_RANK
] <= #TCQ
1'b0
;
2480
end
else
2481
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2482
//for (p = nCS_PER_RANK; p < nCS_PER_RANK*nCK_PER_CLK*2; p = p + (nCS_PER_RANK*2)) begin
2483
//
2484
// phy_int_cs_n[p+:nCS_PER_RANK] <= #TCQ {nCS_PER_RANK{1'b0}};
2485
//end
2486
end
2487
endcase
2488
end
2489
end
2490
end
else
if
(
RANKS
==
2
)
begin
:
DDR3_2rank
2491
always
@(
posedge
clk
)
begin
2492
if
(
rst
)
2493
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2494
else
if
(
init_state_r
==
INIT_REG_WRITE
)
begin
2495
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2496
if
(!(
CWL_M
%
2
))
begin
2497
phy_int_cs_n
[
0
%
nCK_PER_CLK
] <= #TCQ
1'b0
;
2498
phy_int_cs_n
[
1
%
nCK_PER_CLK
] <= #TCQ
1'b0
;
2499
end
else
begin
2500
phy_int_cs_n
[
2
%
nCK_PER_CLK
] <= #TCQ
1'b0
;
2501
phy_int_cs_n
[
3
%
nCK_PER_CLK
] <= #TCQ
1'b0
;
2502
end
2503
end
else
begin
2504
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2505
case
(
chip_cnt_r
)
2506
2'b00
:
begin
2507
if
((
init_state_r
==
INIT_LOAD_MR
) ||
2508
(
init_state_r
==
INIT_MPR_RDEN
) ||
2509
(
init_state_r
==
INIT_MPR_DISABLE
) ||
2510
(
init_state_r
==
INIT_WRLVL_START
) ||
2511
(
init_state_r
==
INIT_WRLVL_LOAD_MR
) ||
2512
(
init_state_r
==
INIT_WRLVL_LOAD_MR2
) ||
2513
(
init_state_r
==
INIT_ZQCL
) ||
2514
(
init_state_r
==
INIT_RDLVL_ACT
) ||
2515
(
init_state_r
==
INIT_WRCAL_ACT
) ||
2516
(
init_state_r
==
INIT_OCLKDELAY_ACT
) ||
2517
(
init_state_r
==
INIT_PRECHARGE
) ||
2518
(
init_state_r
==
INIT_DDR2_PRECHARGE
) ||
2519
(
init_state_r
==
INIT_REFRESH
) ||
2520
(
rdlvl_wr_rd
&&
new_burst_r
))
begin
2521
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2522
if
(!(
CWL_M
%
2
))
begin
//even CWL
2523
for
(
n
=
0
;
n
<
nCS_PER_RANK
;
n
=
n
+
1
)
begin
2524
phy_int_cs_n
[
n
] <= #TCQ
1'b0
;
2525
end
2526
end
else
begin
// odd CWL
2527
for
(
p
=
CS_WIDTH
*
nCS_PER_RANK
;
p
< (
CS_WIDTH
*
nCS_PER_RANK
+
nCS_PER_RANK
);
p
=
p
+
1
)
begin
2528
phy_int_cs_n
[
p
] <= #TCQ
1'b0
;
2529
end
2530
end
2531
end
else
2532
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2533
//for (n = 0; n < nCS_PER_RANK*nCK_PER_CLK*2; n = n + (nCS_PER_RANK*2)) begin
2534
//
2535
// phy_int_cs_n[n+:nCS_PER_RANK] <= #TCQ {nCS_PER_RANK{1'b0}};
2536
//end
2537
end
2538
2'b01
:
begin
2539
if
((
init_state_r
==
INIT_LOAD_MR
) ||
2540
(
init_state_r
==
INIT_MPR_RDEN
) ||
2541
(
init_state_r
==
INIT_MPR_DISABLE
) ||
2542
(
init_state_r
==
INIT_WRLVL_START
) ||
2543
(
init_state_r
==
INIT_WRLVL_LOAD_MR
) ||
2544
(
init_state_r
==
INIT_WRLVL_LOAD_MR2
) ||
2545
(
init_state_r
==
INIT_ZQCL
) ||
2546
(
init_state_r
==
INIT_RDLVL_ACT
) ||
2547
(
init_state_r
==
INIT_WRCAL_ACT
) ||
2548
(
init_state_r
==
INIT_OCLKDELAY_ACT
) ||
2549
(
init_state_r
==
INIT_PRECHARGE
) ||
2550
(
init_state_r
==
INIT_DDR2_PRECHARGE
) ||
2551
(
init_state_r
==
INIT_REFRESH
) ||
2552
(
rdlvl_wr_rd
&&
new_burst_r
))
begin
2553
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2554
if
(!(
CWL_M
%
2
))
begin
//even CWL
2555
for
(
q
=
nCS_PER_RANK
;
q
< (
2
*
nCS_PER_RANK
);
q
=
q
+
1
)
begin
2556
phy_int_cs_n
[
q
] <= #TCQ
1'b0
;
2557
end
2558
end
else
begin
// odd CWL
2559
for
(
m
= (
nCS_PER_RANK
*
CS_WIDTH
+
nCS_PER_RANK
);
m
< (
nCS_PER_RANK
*
CS_WIDTH
+
2
*
nCS_PER_RANK
);
m
=
m
+
1
)
begin
2560
phy_int_cs_n
[
m
] <= #TCQ
1'b0
;
2561
end
2562
end
2563
end
else
2564
phy_int_cs_n
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
*
nCK_PER_CLK
{
1'b1
}};
2565
//for (p = nCS_PER_RANK; p < nCS_PER_RANK*nCK_PER_CLK*2; p = p + (nCS_PER_RANK*2)) begin
2566
//
2567
// phy_int_cs_n[p+:nCS_PER_RANK] <= #TCQ {nCS_PER_RANK{1'b0}};
2568
//end
2569
end
2570
endcase
2571
end
2572
end
// always @ (posedge clk)
2573
end
2574
2575
// commented out for now. Need it for DDR2 2T timing
2576
/* end else begin: DDR2
2577
always @(posedge clk)
2578
if (rst) begin
2579
phy_int_cs_n <= #TCQ {CS_WIDTH*nCS_PER_RANK*nCK_PER_CLK{1'b1}};
2580
end else begin
2581
if (init_state_r == INIT_REG_WRITE) begin
2582
// All ranks selected simultaneously
2583
phy_int_cs_n <= #TCQ {CS_WIDTH*nCS_PER_RANK*nCK_PER_CLK{1'b0}};
2584
end else if ((wrlvl_odt) ||
2585
(init_state_r == INIT_LOAD_MR) ||
2586
(init_state_r == INIT_ZQCL) ||
2587
(init_state_r == INIT_WRLVL_START) ||
2588
(init_state_r == INIT_WRLVL_LOAD_MR) ||
2589
(init_state_r == INIT_WRLVL_LOAD_MR2) ||
2590
(init_state_r == INIT_RDLVL_ACT) ||
2591
(init_state_r == INIT_PI_PHASELOCK_READS) ||
2592
(init_state_r == INIT_RDLVL_STG1_WRITE) ||
2593
(init_state_r == INIT_RDLVL_STG1_READ) ||
2594
(init_state_r == INIT_PRECHARGE) ||
2595
(init_state_r == INIT_RDLVL_STG2_READ) ||
2596
(init_state_r == INIT_WRCAL_ACT) ||
2597
(init_state_r == INIT_WRCAL_READ) ||
2598
(init_state_r == INIT_WRCAL_WRITE) ||
2599
(init_state_r == INIT_DDR2_PRECHARGE) ||
2600
(init_state_r == INIT_REFRESH)) begin
2601
phy_int_cs_n[0] <= #TCQ 1'b0;
2602
end
2603
else phy_int_cs_n <= #TCQ {CS_WIDTH*nCS_PER_RANK*nCK_PER_CLK{1'b1}};
2604
end // else: !if(rst)
2605
end // block: DDR2 **/
2606
endgenerate
2607
2608
assign
phy_cs_n
=
phy_int_cs_n
;
2609
2610
//***************************************************************************
2611
// Write/read burst logic for calibration
2612
//***************************************************************************
2613
2614
assign
rdlvl_wr
= (
init_state_r
==
INIT_OCLKDELAY_WRITE
) ||
2615
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
2616
(
init_state_r
==
INIT_WRCAL_WRITE
);
2617
assign
rdlvl_rd
= (
init_state_r
==
INIT_PI_PHASELOCK_READS
) ||
2618
(
init_state_r
==
INIT_RDLVL_STG1_READ
) ||
2619
(
init_state_r
==
INIT_RDLVL_STG2_READ
) ||
2620
(
init_state_r
==
INIT_OCLKDELAY_READ
) ||
2621
(
init_state_r
==
INIT_WRCAL_READ
) ||
2622
(
init_state_r
==
INIT_MPR_READ
) ||
2623
(
init_state_r
==
INIT_WRCAL_MULT_READS
);
2624
assign
rdlvl_wr_rd
=
rdlvl_wr
|
rdlvl_rd
;
2625
2626
//***************************************************************************
2627
// Address generation and logic to count # of writes/reads issued during
2628
// certain stages of calibration
2629
//***************************************************************************
2630
2631
// Column address generation logic:
2632
// Keep track of the current column address - since all bursts are in
2633
// increments of 8 only during calibration, we need to keep track of
2634
// addresses [COL_WIDTH-1:3], lower order address bits will always = 0
2635
2636
always
@(
posedge
clk
)
2637
if
(
rst
||
wrcal_done
)
2638
burst_addr_r
<= #TCQ
1'b0
;
2639
else
if
((
init_state_r
==
INIT_WRCAL_ACT_WAIT
) ||
2640
(
init_state_r
==
INIT_OCLKDELAY_ACT_WAIT
) ||
2641
(
init_state_r
==
INIT_OCLKDELAY_WRITE
) ||
2642
(
init_state_r
==
INIT_OCLKDELAY_READ
) ||
2643
(
init_state_r
==
INIT_WRCAL_WRITE
) ||
2644
(
init_state_r
==
INIT_WRCAL_WRITE_READ
) ||
2645
(
init_state_r
==
INIT_WRCAL_READ
) ||
2646
(
init_state_r
==
INIT_WRCAL_MULT_READS
) ||
2647
(
init_state_r
==
INIT_WRCAL_READ_WAIT
))
2648
burst_addr_r
<= #TCQ
1'b1
;
2649
else
if
(
rdlvl_wr_rd
&&
new_burst_r
)
2650
burst_addr_r
<= #TCQ ~
burst_addr_r
;
2651
else
2652
burst_addr_r
<= #TCQ
1'b0
;
2653
2654
// Read Level Stage 1 requires writes to the entire row since
2655
// a PRBS pattern is being written. This counter keeps track
2656
// of the number of writes which depends on the column width
2657
// The (stg1_wr_rd_cnt==9'd0) condition was added so the col
2658
// address wraps around during stage1 reads
2659
always
@(
posedge
clk
)
2660
if
(
rst
|| ((
init_state_r
==
INIT_RDLVL_STG1_WRITE_READ
) &&
2661
~
rdlvl_stg1_done
))
2662
stg1_wr_rd_cnt
<= #TCQ
NUM_STG1_WR_RD
;
2663
else
if
(
rdlvl_last_byte_done
|| (
stg1_wr_rd_cnt
==
9'd1
) ||
2664
(
prbs_rdlvl_prech_req
&& (
init_state_r
==
INIT_RDLVL_ACT_WAIT
)))
2665
stg1_wr_rd_cnt
<= #TCQ
'd128
;
2666
else
if
(((
init_state_r
==
INIT_RDLVL_STG1_WRITE
) &&
new_burst_r
&& ~
phy_data_full
)
2667
||((
init_state_r
==
INIT_RDLVL_STG1_READ
) &&
rdlvl_stg1_done
))
2668
stg1_wr_rd_cnt
<= #TCQ
stg1_wr_rd_cnt
-
1
;
2669
2670
// OCLKDELAY calibration requires multiple writes because
2671
// write can be up to 2 cycles early since OCLKDELAY tap
2672
// can go down to 0
2673
always
@(
posedge
clk
)
2674
if
(
rst
|| (
init_state_r
==
INIT_OCLKDELAY_WRITE_WAIT
) ||
2675
(
oclk_wr_cnt
==
4'd0
))
2676
oclk_wr_cnt
<= #TCQ
NUM_STG1_WR_RD
;
2677
else
if
((
init_state_r
==
INIT_OCLKDELAY_WRITE
) &&
2678
new_burst_r
&& ~
phy_data_full
)
2679
oclk_wr_cnt
<= #TCQ
oclk_wr_cnt
-
1
;
2680
2681
// Write calibration requires multiple writes because
2682
// write can be up to 2 cycles early due to new write
2683
// leveling algorithm to avoid late writes
2684
always
@(
posedge
clk
)
2685
if
(
rst
|| (
init_state_r
==
INIT_WRCAL_WRITE_READ
) ||
2686
(
wrcal_wr_cnt
==
4'd0
))
2687
wrcal_wr_cnt
<= #TCQ
NUM_STG1_WR_RD
;
2688
else
if
((
init_state_r
==
INIT_WRCAL_WRITE
) &&
2689
new_burst_r
&& ~
phy_data_full
)
2690
wrcal_wr_cnt
<= #TCQ
wrcal_wr_cnt
-
1
;
2691
2692
2693
generate
2694
if
(
nCK_PER_CLK
==
4
)
begin
:
back_to_back_reads_4_1
2695
// 4 back-to-back reads with gaps for
2696
// read data_offset calibration (rdlvl stage 2)
2697
always
@(
posedge
clk
)
2698
if
(
rst
|| (
init_state_r
==
INIT_RDLVL_STG2_READ_WAIT
))
2699
num_reads
<= #TCQ
3'b000
;
2700
else
if
((
num_reads
>
3'b000
) && ~(
phy_ctl_full
||
phy_cmd_full
))
2701
num_reads
<= #TCQ
num_reads
-
1
;
2702
else
if
((
init_state_r
==
INIT_RDLVL_STG2_READ
) ||
phy_ctl_full
||
2703
phy_cmd_full
&&
new_burst_r
)
2704
num_reads
<= #TCQ
3'b011
;
2705
end
else
if
(
nCK_PER_CLK
==
2
)
begin
:
back_to_back_reads_2_1
2706
// 4 back-to-back reads with gaps for
2707
// read data_offset calibration (rdlvl stage 2)
2708
always
@(
posedge
clk
)
2709
if
(
rst
|| (
init_state_r
==
INIT_RDLVL_STG2_READ_WAIT
))
2710
num_reads
<= #TCQ
3'b000
;
2711
else
if
((
num_reads
>
3'b000
) && ~(
phy_ctl_full
||
phy_cmd_full
))
2712
num_reads
<= #TCQ
num_reads
-
1
;
2713
else
if
((
init_state_r
==
INIT_RDLVL_STG2_READ
) ||
phy_ctl_full
||
2714
phy_cmd_full
&&
new_burst_r
)
2715
num_reads
<= #TCQ
3'b111
;
2716
end
2717
endgenerate
2718
2719
// back-to-back reads during write calibration
2720
always
@(
posedge
clk
)
2721
if
(
rst
||(
init_state_r
==
INIT_WRCAL_READ_WAIT
))
2722
wrcal_reads
<= #TCQ
2'b00
;
2723
else
if
((
wrcal_reads
>
2'b00
) && ~(
phy_ctl_full
||
phy_cmd_full
))
2724
wrcal_reads
<= #TCQ
wrcal_reads
-
1
;
2725
else
if
((
init_state_r
==
INIT_WRCAL_MULT_READS
) ||
phy_ctl_full
||
2726
phy_cmd_full
&&
new_burst_r
)
2727
wrcal_reads
<= #TCQ
'd255
;
2728
2729
// determine how often to issue row command during read leveling writes
2730
// and reads
2731
always
@(
posedge
clk
)
2732
if
(
rdlvl_wr_rd
)
begin
2733
// 2:1 mode - every other command issued is a data command
2734
// 4:1 mode - every command issued is a data command
2735
if
(
nCK_PER_CLK
==
2
)
begin
2736
if
(!
phy_ctl_full
)
2737
new_burst_r
<= #TCQ ~
new_burst_r
;
2738
end
else
2739
new_burst_r
<= #TCQ
1'b1
;
2740
end
else
2741
new_burst_r
<= #TCQ
1'b1
;
2742
2743
// indicate when a write is occurring. PHY_WRDATA_EN must be asserted
2744
// simultaneous with the corresponding command/address for CWL = 5,6
2745
always
@(
posedge
clk
)
begin
2746
rdlvl_wr_r
<= #TCQ
rdlvl_wr
;
2747
calib_wrdata_en
<= #TCQ
phy_wrdata_en
;
2748
end
2749
2750
always
@(
posedge
clk
)
begin
2751
if
(
rst
||
wrcal_done
)
2752
extend_cal_pat
<= #TCQ
1'b0
;
2753
else
if
(
temp_lmr_done
&& (
PRE_REV3ES
==
"ON"
))
2754
extend_cal_pat
<= #TCQ
1'b1
;
2755
end
2756
2757
2758
generate
2759
if
((
nCK_PER_CLK
==
4
) || (
BURST_MODE
==
"4"
))
begin
:
wrdqen_div4
2760
// Write data enable asserted for one DIV4 clock cycle
2761
// Only BL8 supported with DIV4. DDR2 BL4 will use DIV2.
2762
always
@(
rst
or
phy_data_full
or
init_state_r
)
begin
2763
if
(~
phy_data_full
&& ((
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
2764
(
init_state_r
==
INIT_OCLKDELAY_WRITE
) ||
2765
(
init_state_r
==
INIT_WRCAL_WRITE
)))
2766
phy_wrdata_en
=
1'b1
;
2767
else
2768
phy_wrdata_en
=
1'b0
;
2769
end
2770
end
else
begin
:
wrdqen_div2
// block: wrdqen_div4
2771
always
@(
rdlvl_wr
or
phy_ctl_full
or
new_burst_r
or
phy_wrdata_en_r1
2772
or
phy_data_full
)
2773
if
((
rdlvl_wr
& ~
phy_ctl_full
&
new_burst_r
& ~
phy_data_full
)
2774
|
phy_wrdata_en_r1
)
2775
phy_wrdata_en
=
1'b1
;
2776
else
2777
phy_wrdata_en
=
1'b0
;
2778
2779
always
@(
posedge
clk
)
2780
phy_wrdata_en_r1
<= #TCQ
rdlvl_wr
& ~
phy_ctl_full
&
new_burst_r
2781
& ~
phy_data_full
;
2782
2783
always
@(
posedge
clk
)
begin
2784
if
(!
phy_wrdata_en
&
first_rdlvl_pat_r
)
2785
wrdata_pat_cnt
<= #TCQ
2'b00
;
2786
else
if
(
wrdata_pat_cnt
==
2'b11
)
2787
wrdata_pat_cnt
<= #TCQ
2'b10
;
2788
else
2789
wrdata_pat_cnt
<= #TCQ
wrdata_pat_cnt
+
1
;
2790
end
2791
2792
always
@(
posedge
clk
)
begin
2793
if
(!
phy_wrdata_en
&
first_wrcal_pat_r
)
2794
wrcal_pat_cnt
<= #TCQ
2'b00
;
2795
else
if
(
extend_cal_pat
&& (
wrcal_pat_cnt
==
2'b01
))
2796
wrcal_pat_cnt
<= #TCQ
2'b00
;
2797
else
if
(
wrcal_pat_cnt
==
2'b11
)
2798
wrcal_pat_cnt
<= #TCQ
2'b10
;
2799
else
2800
wrcal_pat_cnt
<= #TCQ
wrcal_pat_cnt
+
1
;
2801
end
2802
2803
end
2804
endgenerate
2805
2806
2807
// indicate when a write is occurring. PHY_RDDATA_EN must be asserted
2808
// simultaneous with the corresponding command/address. PHY_RDDATA_EN
2809
// is used during read-leveling to determine read latency
2810
assign
phy_rddata_en
= ~
phy_if_empty
;
2811
2812
// Read data valid generation for MC and User Interface after calibration is
2813
// complete
2814
assign
phy_rddata_valid
=
init_complete_r1_timing
?
phy_rddata_en
:
1'b0
;
2815
2816
//***************************************************************************
2817
// Generate training data written at start of each read-leveling stage
2818
// For every stage of read leveling, 8 words are written into memory
2819
// The format is as follows (shown as {rise,fall}):
2820
// Stage 1: 0xF, 0x0, 0xF, 0x0, 0xF, 0x0, 0xF, 0x0
2821
// Stage 2: 0xF, 0x0, 0xA, 0x5, 0x5, 0xA, 0x9, 0x6
2822
//***************************************************************************
2823
2824
2825
always
@(
posedge
clk
)
2826
if
((
init_state_r
==
INIT_IDLE
) ||
2827
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
))
2828
cnt_init_data_r
<= #TCQ
2'b00
;
2829
else
if
(
phy_wrdata_en
)
2830
cnt_init_data_r
<= #TCQ
cnt_init_data_r
+
1
;
2831
else
if
(
init_state_r
==
INIT_WRCAL_WRITE
)
2832
cnt_init_data_r
<= #TCQ
2'b10
;
2833
2834
2835
// write different sequence for very
2836
// first write to memory only. Used to help us differentiate
2837
// if the writes are "early" or "on-time" during read leveling
2838
always
@(
posedge
clk
)
2839
if
(
rst
||
rdlvl_stg1_rank_done
)
2840
first_rdlvl_pat_r
<= #TCQ
1'b1
;
2841
else
if
(
phy_wrdata_en
&& (
init_state_r
==
INIT_RDLVL_STG1_WRITE
))
2842
first_rdlvl_pat_r
<= #TCQ
1'b0
;
2843
2844
2845
always
@(
posedge
clk
)
2846
if
(
rst
||
wrcal_resume
||
2847
(
init_state_r
==
INIT_WRCAL_ACT_WAIT
))
2848
first_wrcal_pat_r
<= #TCQ
1'b1
;
2849
else
if
(
phy_wrdata_en
&& (
init_state_r
==
INIT_WRCAL_WRITE
))
2850
first_wrcal_pat_r
<= #TCQ
1'b0
;
2851
2852
generate
2853
if
((
CLK_PERIOD
/
nCK_PER_CLK
>
2500
) && (
nCK_PER_CLK
==
2
))
begin
:
wrdq_div2_2to1_rdlvl_first
2854
2855
always
@(
posedge
clk
)
2856
if
(~
oclkdelay_calib_done
)
2857
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'hF
}},
2858
{
DQ_WIDTH
/
4
{
4'h0
}},
2859
{
DQ_WIDTH
/
4
{
4'hF
}},
2860
{
DQ_WIDTH
/
4
{
4'h0
}}};
2861
else
if
(!
rdlvl_stg1_done
)
begin
2862
// The 16 words for stage 1 write data in 2:1 mode is written
2863
// over 4 consecutive controller clock cycles. Note that write
2864
// data follows phy_wrdata_en by one clock cycle
2865
case
(
wrdata_pat_cnt
)
2866
2'b00
:
begin
2867
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'hE
}},
2868
{
DQ_WIDTH
/
4
{
4'h7
}},
2869
{
DQ_WIDTH
/
4
{
4'h3
}},
2870
{
DQ_WIDTH
/
4
{
4'h9
}}};
2871
end
2872
2873
2'b01
:
begin
2874
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h4
}},
2875
{
DQ_WIDTH
/
4
{
4'h2
}},
2876
{
DQ_WIDTH
/
4
{
4'h9
}},
2877
{
DQ_WIDTH
/
4
{
4'hC
}}};
2878
end
2879
2880
2'b10
:
begin
2881
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'hE
}},
2882
{
DQ_WIDTH
/
4
{
4'h7
}},
2883
{
DQ_WIDTH
/
4
{
4'h1
}},
2884
{
DQ_WIDTH
/
4
{
4'hB
}}};
2885
end
2886
2887
2'b11
:
begin
2888
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h4
}},
2889
{
DQ_WIDTH
/
4
{
4'h2
}},
2890
{
DQ_WIDTH
/
4
{
4'h9
}},
2891
{
DQ_WIDTH
/
4
{
4'hC
}}};
2892
end
2893
endcase
2894
end
else
if
(!
prbs_rdlvl_done
&& ~
phy_data_full
)
begin
2895
// prbs_o is 8-bits wide hence {DQ_WIDTH/8{prbs_o}} results in
2896
// prbs_o being concatenated 8 times resulting in DQ_WIDTH
2897
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
8
{
prbs_o
[
4
*
8
-
1
:
3
*
8
]}},
2898
{
DQ_WIDTH
/
8
{
prbs_o
[
3
*
8
-
1
:
2
*
8
]}},
2899
{
DQ_WIDTH
/
8
{
prbs_o
[
2
*
8
-
1
:
8
]}},
2900
{
DQ_WIDTH
/
8
{
prbs_o
[
8
-
1
:
0
]}}};
2901
end
else
if
(!
wrcal_done
)
begin
2902
case
(
wrcal_pat_cnt
)
2903
2'b00
:
begin
2904
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h5
}},
2905
{
DQ_WIDTH
/
4
{
4'hA
}},
2906
{
DQ_WIDTH
/
4
{
4'h0
}},
2907
{
DQ_WIDTH
/
4
{
4'hF
}}};
2908
end
2909
2'b01
:
begin
2910
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h6
}},
2911
{
DQ_WIDTH
/
4
{
4'h9
}},
2912
{
DQ_WIDTH
/
4
{
4'hA
}},
2913
{
DQ_WIDTH
/
4
{
4'h5
}}};
2914
end
2915
2'b10
:
begin
2916
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h4
}},
2917
{
DQ_WIDTH
/
4
{
4'hE
}},
2918
{
DQ_WIDTH
/
4
{
4'h1
}},
2919
{
DQ_WIDTH
/
4
{
4'hB
}}};
2920
end
2921
2'b11
:
begin
2922
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h8
}},
2923
{
DQ_WIDTH
/
4
{
4'hD
}},
2924
{
DQ_WIDTH
/
4
{
4'hE
}},
2925
{
DQ_WIDTH
/
4
{
4'h4
}}};
2926
end
2927
endcase
2928
end
2929
2930
end
else
if
((
CLK_PERIOD
/
nCK_PER_CLK
>
2500
) && (
nCK_PER_CLK
==
4
))
begin
:
wrdq_div2_4to1_rdlvl_first
2931
2932
always
@(
posedge
clk
)
2933
if
(~
oclkdelay_calib_done
)
2934
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'hF
}},{
DQ_WIDTH
/
4
{
4'h0
}},
2935
{
DQ_WIDTH
/
4
{
4'hF
}},{
DQ_WIDTH
/
4
{
4'h0
}},
2936
{
DQ_WIDTH
/
4
{
4'hF
}},{
DQ_WIDTH
/
4
{
4'h0
}},
2937
{
DQ_WIDTH
/
4
{
4'hF
}},{
DQ_WIDTH
/
4
{
4'h0
}}};
2938
else
if
(!
rdlvl_stg1_done
&& ~
phy_data_full
)
2939
// write different sequence for very
2940
// first write to memory only. Used to help us differentiate
2941
// if the writes are "early" or "on-time" during read leveling
2942
if
(
first_rdlvl_pat_r
)
2943
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h4
}},{
DQ_WIDTH
/
4
{
4'h2
}},
2944
{
DQ_WIDTH
/
4
{
4'h9
}},{
DQ_WIDTH
/
4
{
4'hC
}},
2945
{
DQ_WIDTH
/
4
{
4'hE
}},{
DQ_WIDTH
/
4
{
4'h7
}},
2946
{
DQ_WIDTH
/
4
{
4'h3
}},{
DQ_WIDTH
/
4
{
4'h9
}}};
2947
else
2948
// For all others, change the first two words written in order
2949
// to differentiate the "early write" and "on-time write"
2950
// readback patterns during read leveling
2951
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h4
}},{
DQ_WIDTH
/
4
{
4'h2
}},
2952
{
DQ_WIDTH
/
4
{
4'h9
}},{
DQ_WIDTH
/
4
{
4'hC
}},
2953
{
DQ_WIDTH
/
4
{
4'hE
}},{
DQ_WIDTH
/
4
{
4'h7
}},
2954
{
DQ_WIDTH
/
4
{
4'h1
}},{
DQ_WIDTH
/
4
{
4'hB
}}};
2955
else
if
(!
prbs_rdlvl_done
&& ~
phy_data_full
)
2956
// prbs_o is 8-bits wide hence {DQ_WIDTH/8{prbs_o}} results in
2957
// prbs_o being concatenated 8 times resulting in DQ_WIDTH
2958
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
8
{
prbs_o
[
8
*
8
-
1
:
7
*
8
]}},{
DQ_WIDTH
/
8
{
prbs_o
[
7
*
8
-
1
:
6
*
8
]}},
2959
{
DQ_WIDTH
/
8
{
prbs_o
[
6
*
8
-
1
:
5
*
8
]}},{
DQ_WIDTH
/
8
{
prbs_o
[
5
*
8
-
1
:
4
*
8
]}},
2960
{
DQ_WIDTH
/
8
{
prbs_o
[
4
*
8
-
1
:
3
*
8
]}},{
DQ_WIDTH
/
8
{
prbs_o
[
3
*
8
-
1
:
2
*
8
]}},
2961
{
DQ_WIDTH
/
8
{
prbs_o
[
2
*
8
-
1
:
8
]}},{
DQ_WIDTH
/
8
{
prbs_o
[
8
-
1
:
0
]}}};
2962
else
if
(!
wrcal_done
)
2963
if
(
first_wrcal_pat_r
)
2964
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h6
}},{
DQ_WIDTH
/
4
{
4'h9
}},
2965
{
DQ_WIDTH
/
4
{
4'hA
}},{
DQ_WIDTH
/
4
{
4'h5
}},
2966
{
DQ_WIDTH
/
4
{
4'h5
}},{
DQ_WIDTH
/
4
{
4'hA
}},
2967
{
DQ_WIDTH
/
4
{
4'h0
}},{
DQ_WIDTH
/
4
{
4'hF
}}};
2968
else
2969
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h8
}},{
DQ_WIDTH
/
4
{
4'hD
}},
2970
{
DQ_WIDTH
/
4
{
4'hE
}},{
DQ_WIDTH
/
4
{
4'h4
}},
2971
{
DQ_WIDTH
/
4
{
4'h4
}},{
DQ_WIDTH
/
4
{
4'hE
}},
2972
{
DQ_WIDTH
/
4
{
4'h1
}},{
DQ_WIDTH
/
4
{
4'hB
}}};
2973
2974
2975
end
else
if
(
nCK_PER_CLK
==
4
)
begin
:
wrdq_div1_4to1_wrcal_first
2976
2977
always
@(
posedge
clk
)
2978
if
((~
oclkdelay_calib_done
) && (
DRAM_TYPE
==
"DDR3"
))
2979
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'hF
}},{
DQ_WIDTH
/
4
{
4'h0
}},
2980
{
DQ_WIDTH
/
4
{
4'hF
}},{
DQ_WIDTH
/
4
{
4'h0
}},
2981
{
DQ_WIDTH
/
4
{
4'hF
}},{
DQ_WIDTH
/
4
{
4'h0
}},
2982
{
DQ_WIDTH
/
4
{
4'hF
}},{
DQ_WIDTH
/
4
{
4'h0
}}};
2983
else
if
((!
wrcal_done
)&& (
DRAM_TYPE
==
"DDR3"
))
begin
2984
if
(
extend_cal_pat
)
2985
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h6
}},{
DQ_WIDTH
/
4
{
4'h9
}},
2986
{
DQ_WIDTH
/
4
{
4'hA
}},{
DQ_WIDTH
/
4
{
4'h5
}},
2987
{
DQ_WIDTH
/
4
{
4'h5
}},{
DQ_WIDTH
/
4
{
4'hA
}},
2988
{
DQ_WIDTH
/
4
{
4'h0
}},{
DQ_WIDTH
/
4
{
4'hF
}}};
2989
else
if
(
first_wrcal_pat_r
)
2990
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h6
}},{
DQ_WIDTH
/
4
{
4'h9
}},
2991
{
DQ_WIDTH
/
4
{
4'hA
}},{
DQ_WIDTH
/
4
{
4'h5
}},
2992
{
DQ_WIDTH
/
4
{
4'h5
}},{
DQ_WIDTH
/
4
{
4'hA
}},
2993
{
DQ_WIDTH
/
4
{
4'h0
}},{
DQ_WIDTH
/
4
{
4'hF
}}};
2994
else
2995
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h8
}},{
DQ_WIDTH
/
4
{
4'hD
}},
2996
{
DQ_WIDTH
/
4
{
4'hE
}},{
DQ_WIDTH
/
4
{
4'h4
}},
2997
{
DQ_WIDTH
/
4
{
4'h4
}},{
DQ_WIDTH
/
4
{
4'hE
}},
2998
{
DQ_WIDTH
/
4
{
4'h1
}},{
DQ_WIDTH
/
4
{
4'hB
}}};
2999
end
else
if
(!
rdlvl_stg1_done
&& ~
phy_data_full
)
begin
3000
// write different sequence for very
3001
// first write to memory only. Used to help us differentiate
3002
// if the writes are "early" or "on-time" during read leveling
3003
if
(
first_rdlvl_pat_r
)
3004
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h4
}},{
DQ_WIDTH
/
4
{
4'h2
}},
3005
{
DQ_WIDTH
/
4
{
4'h9
}},{
DQ_WIDTH
/
4
{
4'hC
}},
3006
{
DQ_WIDTH
/
4
{
4'hE
}},{
DQ_WIDTH
/
4
{
4'h7
}},
3007
{
DQ_WIDTH
/
4
{
4'h3
}},{
DQ_WIDTH
/
4
{
4'h9
}}};
3008
else
3009
// For all others, change the first two words written in order
3010
// to differentiate the "early write" and "on-time write"
3011
// readback patterns during read leveling
3012
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h4
}},{
DQ_WIDTH
/
4
{
4'h2
}},
3013
{
DQ_WIDTH
/
4
{
4'h9
}},{
DQ_WIDTH
/
4
{
4'hC
}},
3014
{
DQ_WIDTH
/
4
{
4'hE
}},{
DQ_WIDTH
/
4
{
4'h7
}},
3015
{
DQ_WIDTH
/
4
{
4'h1
}},{
DQ_WIDTH
/
4
{
4'hB
}}};
3016
end
else
if
(!
prbs_rdlvl_done
&& ~
phy_data_full
)
3017
// prbs_o is 8-bits wide hence {DQ_WIDTH/8{prbs_o}} results in
3018
// prbs_o being concatenated 8 times resulting in DQ_WIDTH
3019
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
8
{
prbs_o
[
8
*
8
-
1
:
7
*
8
]}},{
DQ_WIDTH
/
8
{
prbs_o
[
7
*
8
-
1
:
6
*
8
]}},
3020
{
DQ_WIDTH
/
8
{
prbs_o
[
6
*
8
-
1
:
5
*
8
]}},{
DQ_WIDTH
/
8
{
prbs_o
[
5
*
8
-
1
:
4
*
8
]}},
3021
{
DQ_WIDTH
/
8
{
prbs_o
[
4
*
8
-
1
:
3
*
8
]}},{
DQ_WIDTH
/
8
{
prbs_o
[
3
*
8
-
1
:
2
*
8
]}},
3022
{
DQ_WIDTH
/
8
{
prbs_o
[
2
*
8
-
1
:
8
]}},{
DQ_WIDTH
/
8
{
prbs_o
[
8
-
1
:
0
]}}};
3023
3024
end
else
begin
:
wrdq_div1_2to1_wrcal_first
3025
3026
always
@(
posedge
clk
)
3027
if
((~
oclkdelay_calib_done
)&& (
DRAM_TYPE
==
"DDR3"
))
3028
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'hF
}},
3029
{
DQ_WIDTH
/
4
{
4'h0
}},
3030
{
DQ_WIDTH
/
4
{
4'hF
}},
3031
{
DQ_WIDTH
/
4
{
4'h0
}}};
3032
else
if
((!
wrcal_done
) && (
DRAM_TYPE
==
"DDR3"
))
begin
3033
case
(
wrcal_pat_cnt
)
3034
2'b00
:
begin
3035
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h5
}},
3036
{
DQ_WIDTH
/
4
{
4'hA
}},
3037
{
DQ_WIDTH
/
4
{
4'h0
}},
3038
{
DQ_WIDTH
/
4
{
4'hF
}}};
3039
end
3040
2'b01
:
begin
3041
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h6
}},
3042
{
DQ_WIDTH
/
4
{
4'h9
}},
3043
{
DQ_WIDTH
/
4
{
4'hA
}},
3044
{
DQ_WIDTH
/
4
{
4'h5
}}};
3045
end
3046
2'b10
:
begin
3047
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h4
}},
3048
{
DQ_WIDTH
/
4
{
4'hE
}},
3049
{
DQ_WIDTH
/
4
{
4'h1
}},
3050
{
DQ_WIDTH
/
4
{
4'hB
}}};
3051
end
3052
2'b11
:
begin
3053
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h8
}},
3054
{
DQ_WIDTH
/
4
{
4'hD
}},
3055
{
DQ_WIDTH
/
4
{
4'hE
}},
3056
{
DQ_WIDTH
/
4
{
4'h4
}}};
3057
end
3058
endcase
3059
end
else
if
(!
rdlvl_stg1_done
)
begin
3060
// The 16 words for stage 1 write data in 2:1 mode is written
3061
// over 4 consecutive controller clock cycles. Note that write
3062
// data follows phy_wrdata_en by one clock cycle
3063
case
(
wrdata_pat_cnt
)
3064
2'b00
:
begin
3065
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'hE
}},
3066
{
DQ_WIDTH
/
4
{
4'h7
}},
3067
{
DQ_WIDTH
/
4
{
4'h3
}},
3068
{
DQ_WIDTH
/
4
{
4'h9
}}};
3069
end
3070
3071
2'b01
:
begin
3072
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h4
}},
3073
{
DQ_WIDTH
/
4
{
4'h2
}},
3074
{
DQ_WIDTH
/
4
{
4'h9
}},
3075
{
DQ_WIDTH
/
4
{
4'hC
}}};
3076
end
3077
3078
2'b10
:
begin
3079
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'hE
}},
3080
{
DQ_WIDTH
/
4
{
4'h7
}},
3081
{
DQ_WIDTH
/
4
{
4'h1
}},
3082
{
DQ_WIDTH
/
4
{
4'hB
}}};
3083
end
3084
3085
2'b11
:
begin
3086
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
4
{
4'h4
}},
3087
{
DQ_WIDTH
/
4
{
4'h2
}},
3088
{
DQ_WIDTH
/
4
{
4'h9
}},
3089
{
DQ_WIDTH
/
4
{
4'hC
}}};
3090
end
3091
endcase
3092
end
else
if
(!
prbs_rdlvl_done
&& ~
phy_data_full
)
begin
3093
// prbs_o is 8-bits wide hence {DQ_WIDTH/8{prbs_o}} results in
3094
// prbs_o being concatenated 8 times resulting in DQ_WIDTH
3095
phy_wrdata
<= #TCQ {{
DQ_WIDTH
/
8
{
prbs_o
[
4
*
8
-
1
:
3
*
8
]}},
3096
{
DQ_WIDTH
/
8
{
prbs_o
[
3
*
8
-
1
:
2
*
8
]}},
3097
{
DQ_WIDTH
/
8
{
prbs_o
[
2
*
8
-
1
:
8
]}},
3098
{
DQ_WIDTH
/
8
{
prbs_o
[
8
-
1
:
0
]}}};
3099
end
3100
3101
end
3102
endgenerate
3103
3104
//***************************************************************************
3105
// Memory control/address
3106
//***************************************************************************
3107
3108
3109
// Phases [2] and [3] are always deasserted for 4:1 mode
3110
generate
3111
if
(
nCK_PER_CLK
==
4
)
begin
:
gen_div4_ca_tieoff
3112
always
@(
posedge
clk
)
begin
3113
phy_ras_n
[
3
:
2
] <= #TCQ
3'b11
;
3114
phy_cas_n
[
3
:
2
] <= #TCQ
3'b11
;
3115
phy_we_n
[
3
:
2
] <= #TCQ
3'b11
;
3116
end
3117
end
3118
endgenerate
3119
3120
// Assert RAS when: (1) Loading MRS, (2) Activating Row, (3) Precharging
3121
// (4) auto refresh
3122
generate
3123
if
(!(
CWL_M
%
2
))
begin
:
even_cwl
3124
always
@(
posedge
clk
)
begin
3125
if
((
init_state_r
==
INIT_LOAD_MR
) ||
3126
(
init_state_r
==
INIT_MPR_RDEN
) ||
3127
(
init_state_r
==
INIT_MPR_DISABLE
) ||
3128
(
init_state_r
==
INIT_REG_WRITE
) ||
3129
(
init_state_r
==
INIT_WRLVL_START
) ||
3130
(
init_state_r
==
INIT_WRLVL_LOAD_MR
) ||
3131
(
init_state_r
==
INIT_WRLVL_LOAD_MR2
) ||
3132
(
init_state_r
==
INIT_RDLVL_ACT
) ||
3133
(
init_state_r
==
INIT_WRCAL_ACT
) ||
3134
(
init_state_r
==
INIT_OCLKDELAY_ACT
) ||
3135
(
init_state_r
==
INIT_PRECHARGE
) ||
3136
(
init_state_r
==
INIT_DDR2_PRECHARGE
) ||
3137
(
init_state_r
==
INIT_REFRESH
))
begin
3138
phy_ras_n
[
0
] <= #TCQ
1'b0
;
3139
phy_ras_n
[
1
] <= #TCQ
1'b1
;
3140
end
else
begin
3141
phy_ras_n
[
0
] <= #TCQ
1'b1
;
3142
phy_ras_n
[
1
] <= #TCQ
1'b1
;
3143
end
3144
end
3145
3146
// Assert CAS when: (1) Loading MRS, (2) Issuing Read/Write command
3147
// (3) auto refresh
3148
always
@(
posedge
clk
)
begin
3149
if
((
init_state_r
==
INIT_LOAD_MR
) ||
3150
(
init_state_r
==
INIT_MPR_RDEN
) ||
3151
(
init_state_r
==
INIT_MPR_DISABLE
) ||
3152
(
init_state_r
==
INIT_REG_WRITE
) ||
3153
(
init_state_r
==
INIT_WRLVL_START
) ||
3154
(
init_state_r
==
INIT_WRLVL_LOAD_MR
) ||
3155
(
init_state_r
==
INIT_WRLVL_LOAD_MR2
) ||
3156
(
init_state_r
==
INIT_REFRESH
) ||
3157
(
rdlvl_wr_rd
&&
new_burst_r
))
begin
3158
phy_cas_n
[
0
] <= #TCQ
1'b0
;
3159
phy_cas_n
[
1
] <= #TCQ
1'b1
;
3160
end
else
begin
3161
phy_cas_n
[
0
] <= #TCQ
1'b1
;
3162
phy_cas_n
[
1
] <= #TCQ
1'b1
;
3163
end
3164
end
3165
// Assert WE when: (1) Loading MRS, (2) Issuing Write command (only
3166
// occur during read leveling), (3) Issuing ZQ Long Calib command,
3167
// (4) Precharge
3168
always
@(
posedge
clk
)
begin
3169
if
((
init_state_r
==
INIT_LOAD_MR
) ||
3170
(
init_state_r
==
INIT_MPR_RDEN
) ||
3171
(
init_state_r
==
INIT_MPR_DISABLE
) ||
3172
(
init_state_r
==
INIT_REG_WRITE
) ||
3173
(
init_state_r
==
INIT_ZQCL
) ||
3174
(
init_state_r
==
INIT_WRLVL_START
) ||
3175
(
init_state_r
==
INIT_WRLVL_LOAD_MR
) ||
3176
(
init_state_r
==
INIT_WRLVL_LOAD_MR2
) ||
3177
(
init_state_r
==
INIT_PRECHARGE
) ||
3178
(
init_state_r
==
INIT_DDR2_PRECHARGE
)||
3179
(
rdlvl_wr
&&
new_burst_r
))
begin
3180
phy_we_n
[
0
] <= #TCQ
1'b0
;
3181
phy_we_n
[
1
] <= #TCQ
1'b1
;
3182
end
else
begin
3183
phy_we_n
[
0
] <= #TCQ
1'b1
;
3184
phy_we_n
[
1
] <= #TCQ
1'b1
;
3185
end
3186
end
3187
end
else
begin
:
odd_cwl
3188
always
@(
posedge
clk
)
begin
3189
if
((
init_state_r
==
INIT_LOAD_MR
) ||
3190
(
init_state_r
==
INIT_MPR_RDEN
) ||
3191
(
init_state_r
==
INIT_MPR_DISABLE
) ||
3192
(
init_state_r
==
INIT_REG_WRITE
) ||
3193
(
init_state_r
==
INIT_WRLVL_START
) ||
3194
(
init_state_r
==
INIT_WRLVL_LOAD_MR
) ||
3195
(
init_state_r
==
INIT_WRLVL_LOAD_MR2
) ||
3196
(
init_state_r
==
INIT_RDLVL_ACT
) ||
3197
(
init_state_r
==
INIT_WRCAL_ACT
) ||
3198
(
init_state_r
==
INIT_OCLKDELAY_ACT
) ||
3199
(
init_state_r
==
INIT_PRECHARGE
) ||
3200
(
init_state_r
==
INIT_DDR2_PRECHARGE
) ||
3201
(
init_state_r
==
INIT_REFRESH
))
begin
3202
phy_ras_n
[
0
] <= #TCQ
1'b1
;
3203
phy_ras_n
[
1
] <= #TCQ
1'b0
;
3204
end
else
begin
3205
phy_ras_n
[
0
] <= #TCQ
1'b1
;
3206
phy_ras_n
[
1
] <= #TCQ
1'b1
;
3207
end
3208
end
3209
// Assert CAS when: (1) Loading MRS, (2) Issuing Read/Write command
3210
// (3) auto refresh
3211
always
@(
posedge
clk
)
begin
3212
if
((
init_state_r
==
INIT_LOAD_MR
) ||
3213
(
init_state_r
==
INIT_MPR_RDEN
) ||
3214
(
init_state_r
==
INIT_MPR_DISABLE
) ||
3215
(
init_state_r
==
INIT_REG_WRITE
) ||
3216
(
init_state_r
==
INIT_WRLVL_START
) ||
3217
(
init_state_r
==
INIT_WRLVL_LOAD_MR
) ||
3218
(
init_state_r
==
INIT_WRLVL_LOAD_MR2
) ||
3219
(
init_state_r
==
INIT_REFRESH
) ||
3220
(
rdlvl_wr_rd
&&
new_burst_r
))
begin
3221
phy_cas_n
[
0
] <= #TCQ
1'b1
;
3222
phy_cas_n
[
1
] <= #TCQ
1'b0
;
3223
end
else
begin
3224
phy_cas_n
[
0
] <= #TCQ
1'b1
;
3225
phy_cas_n
[
1
] <= #TCQ
1'b1
;
3226
end
3227
end
3228
// Assert WE when: (1) Loading MRS, (2) Issuing Write command (only
3229
// occur during read leveling), (3) Issuing ZQ Long Calib command,
3230
// (4) Precharge
3231
always
@(
posedge
clk
)
begin
3232
if
((
init_state_r
==
INIT_LOAD_MR
) ||
3233
(
init_state_r
==
INIT_MPR_RDEN
) ||
3234
(
init_state_r
==
INIT_MPR_DISABLE
) ||
3235
(
init_state_r
==
INIT_REG_WRITE
) ||
3236
(
init_state_r
==
INIT_ZQCL
) ||
3237
(
init_state_r
==
INIT_WRLVL_START
) ||
3238
(
init_state_r
==
INIT_WRLVL_LOAD_MR
) ||
3239
(
init_state_r
==
INIT_WRLVL_LOAD_MR2
) ||
3240
(
init_state_r
==
INIT_PRECHARGE
) ||
3241
(
init_state_r
==
INIT_DDR2_PRECHARGE
)||
3242
(
rdlvl_wr
&&
new_burst_r
))
begin
3243
phy_we_n
[
0
] <= #TCQ
1'b1
;
3244
phy_we_n
[
1
] <= #TCQ
1'b0
;
3245
end
else
begin
3246
phy_we_n
[
0
] <= #TCQ
1'b1
;
3247
phy_we_n
[
1
] <= #TCQ
1'b1
;
3248
end
3249
end
3250
end
3251
endgenerate
3252
3253
3254
3255
// Assign calib_cmd for the command field in PHY_Ctl_Word
3256
always
@(
posedge
clk
)
begin
3257
if
(
wr_level_dqs_asrt
)
begin
3258
// Request to toggle DQS during write leveling
3259
calib_cmd
<= #TCQ
3'b001
;
3260
if
(
CWL_M
%
2
)
begin
// odd write latency
3261
calib_data_offset_0
<= #TCQ
CWL_M
+
3
;
3262
calib_data_offset_1
<= #TCQ
CWL_M
+
3
;
3263
calib_data_offset_2
<= #TCQ
CWL_M
+
3
;
3264
calib_cas_slot
<= #TCQ
2'b01
;
3265
end
else
begin
// even write latency
3266
calib_data_offset_0
<= #TCQ
CWL_M
+
2
;
3267
calib_data_offset_1
<= #TCQ
CWL_M
+
2
;
3268
calib_data_offset_2
<= #TCQ
CWL_M
+
2
;
3269
calib_cas_slot
<= #TCQ
2'b00
;
3270
end
3271
end
else
if
(
rdlvl_wr
&&
new_burst_r
)
begin
3272
// Write Command
3273
calib_cmd
<= #TCQ
3'b001
;
3274
if
(
CWL_M
%
2
)
begin
// odd write latency
3275
calib_data_offset_0
<= #TCQ (
nCK_PER_CLK
==
4
) ?
CWL_M
+
3
:
CWL_M
-
1
;
3276
calib_data_offset_1
<= #TCQ (
nCK_PER_CLK
==
4
) ?
CWL_M
+
3
:
CWL_M
-
1
;
3277
calib_data_offset_2
<= #TCQ (
nCK_PER_CLK
==
4
) ?
CWL_M
+
3
:
CWL_M
-
1
;
3278
calib_cas_slot
<= #TCQ
2'b01
;
3279
end
else
begin
// even write latency
3280
calib_data_offset_0
<= #TCQ (
nCK_PER_CLK
==
4
) ?
CWL_M
+
2
:
CWL_M
-
2
;
3281
calib_data_offset_1
<= #TCQ (
nCK_PER_CLK
==
4
) ?
CWL_M
+
2
:
CWL_M
-
2
;
3282
calib_data_offset_2
<= #TCQ (
nCK_PER_CLK
==
4
) ?
CWL_M
+
2
:
CWL_M
-
2
;
3283
calib_cas_slot
<= #TCQ
2'b00
;
3284
end
3285
end
else
if
(
rdlvl_rd
&&
new_burst_r
)
begin
3286
// Read Command
3287
calib_cmd
<= #TCQ
3'b011
;
3288
if
(
CWL_M
%
2
)
3289
calib_cas_slot
<= #TCQ
2'b01
;
3290
else
3291
calib_cas_slot
<= #TCQ
2'b00
;
3292
if
(~
pi_calib_done_r1
)
begin
3293
calib_data_offset_0
<= #TCQ
6'd0
;
3294
calib_data_offset_1
<= #TCQ
6'd0
;
3295
calib_data_offset_2
<= #TCQ
6'd0
;
3296
end
else
if
(~
pi_dqs_found_done_r1
)
begin
3297
calib_data_offset_0
<= #TCQ
rd_data_offset_0
;
3298
calib_data_offset_1
<= #TCQ
rd_data_offset_1
;
3299
calib_data_offset_2
<= #TCQ
rd_data_offset_2
;
3300
end
else
begin
3301
calib_data_offset_0
<= #TCQ
rd_data_offset_ranks_0
[
6
*
chip_cnt_r
+:
6
];
3302
calib_data_offset_1
<= #TCQ
rd_data_offset_ranks_1
[
6
*
chip_cnt_r
+:
6
];
3303
calib_data_offset_2
<= #TCQ
rd_data_offset_ranks_2
[
6
*
chip_cnt_r
+:
6
];
3304
end
3305
end
else
begin
3306
// Non-Data Commands like NOP, MRS, ZQ Long Cal, Precharge,
3307
// Active, Refresh
3308
calib_cmd
<= #TCQ
3'b100
;
3309
calib_data_offset_0
<= #TCQ
6'd0
;
3310
calib_data_offset_1
<= #TCQ
6'd0
;
3311
calib_data_offset_2
<= #TCQ
6'd0
;
3312
if
(
CWL_M
%
2
)
3313
calib_cas_slot
<= #TCQ
2'b01
;
3314
else
3315
calib_cas_slot
<= #TCQ
2'b00
;
3316
end
3317
end
3318
3319
// Write Enable to PHY_Control FIFO always asserted
3320
// No danger of this FIFO being Full with 4:1 sync clock ratio
3321
// This is also the write enable to the command OUT_FIFO
3322
always
@(
posedge
clk
)
begin
3323
if
(
rst
)
begin
3324
calib_ctl_wren
<= #TCQ
1'b0
;
3325
calib_cmd_wren
<= #TCQ
1'b0
;
3326
calib_seq
<= #TCQ
2'b00
;
3327
end
else
if
(
cnt_pwron_cke_done_r
&&
phy_ctl_ready
3328
&& ~(
phy_ctl_full
||
phy_cmd_full
))
begin
3329
calib_ctl_wren
<= #TCQ
1'b1
;
3330
calib_cmd_wren
<= #TCQ
1'b1
;
3331
calib_seq
<= #TCQ
calib_seq
+
1
;
3332
end
else
begin
3333
calib_ctl_wren
<= #TCQ
1'b0
;
3334
calib_cmd_wren
<= #TCQ
1'b0
;
3335
calib_seq
<= #TCQ
calib_seq
;
3336
end
3337
end
3338
3339
generate
3340
genvar
rnk_i
;
3341
for
(
rnk_i
=
0
;
rnk_i
<
4
;
rnk_i
=
rnk_i
+
1
)
begin
:
gen_rnk
3342
always
@(
posedge
clk
)
begin
3343
if
(
rst
)
begin
3344
mr2_r
[
rnk_i
] <= #TCQ
2'b00
;
3345
mr1_r
[
rnk_i
] <= #TCQ
3'b000
;
3346
end
else
begin
3347
mr2_r
[
rnk_i
] <= #TCQ
tmp_mr2_r
[
rnk_i
];
3348
mr1_r
[
rnk_i
] <= #TCQ
tmp_mr1_r
[
rnk_i
];
3349
end
3350
end
3351
end
3352
endgenerate
3353
3354
// ODT assignment based on slot config and slot present
3355
// For single slot systems slot_1_present input will be ignored
3356
// Assuming component interfaces to be single slot systems
3357
generate
3358
if
(
nSLOTS
==
1
)
begin
:
gen_single_slot_odt
3359
always
@(
posedge
clk
)
begin
3360
if
(
rst
)
begin
3361
tmp_mr2_r
[
1
] <= #TCQ
2'b00
;
3362
tmp_mr2_r
[
2
] <= #TCQ
2'b00
;
3363
tmp_mr2_r
[
3
] <= #TCQ
2'b00
;
3364
tmp_mr1_r
[
1
] <= #TCQ
3'b000
;
3365
tmp_mr1_r
[
2
] <= #TCQ
3'b000
;
3366
tmp_mr1_r
[
3
] <= #TCQ
3'b000
;
3367
phy_tmp_cs1_r
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
{
1'b1
}};
3368
phy_tmp_odt_r
<= #TCQ
4'b0000
;
3369
phy_tmp_odt_r1
<= #TCQ
phy_tmp_odt_r
;
3370
end
else
begin
3371
case
({
slot_0_present
[
0
],
slot_0_present
[
1
],
3372
slot_0_present
[
2
],
slot_0_present
[
3
]})
3373
// Single slot configuration with quad rank
3374
// Assuming same behavior as single slot dual rank for now
3375
// DDR2 does not have quad rank parts
3376
4'b1111
:
begin
3377
if
((
RTT_WR
==
"OFF"
) ||
3378
((
WRLVL
==
"ON"
) && ~
wrlvl_done
&&
3379
(
wrlvl_rank_cntr
==
3'd0
)))
begin
3380
//Rank0 Dynamic ODT disabled
3381
tmp_mr2_r
[
0
] <= #TCQ
2'b00
;
3382
//Rank0 RTT_NOM
3383
tmp_mr1_r
[
0
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3384
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3385
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3386
3'b000
;
3387
end
else
begin
3388
//Rank0 Dynamic ODT defaults to 120 ohms
3389
tmp_mr2_r
[
0
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3390
2'b10
;
3391
//Rank0 RTT_NOM after write leveling completes
3392
tmp_mr1_r
[
0
] <= #TCQ
3'b000
;
3393
end
3394
phy_tmp_odt_r
<= #TCQ
4'b0001
;
3395
// Chip Select assignments
3396
phy_tmp_cs1_r
[((
chip_cnt_r
*
nCS_PER_RANK
)
3397
) +:
nCS_PER_RANK
] <= #TCQ
'b0
;
3398
end
3399
3400
// Single slot configuration with single rank
3401
4'b1000
:
begin
3402
phy_tmp_odt_r
<= #TCQ
4'b0001
;
3403
if
((
REG_CTRL
==
"ON"
) && (
nCS_PER_RANK
>
1
))
begin
3404
phy_tmp_cs1_r
[
chip_cnt_r
] <= #TCQ
1'b0
;
3405
end
else
begin
3406
phy_tmp_cs1_r
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
{
1'b0
}};
3407
end
3408
if
((
RTT_WR
==
"OFF"
) ||
3409
((
WRLVL
==
"ON"
) && ~
wrlvl_done
&&
3410
((
cnt_init_mr_r
==
2'd0
) || (
USE_ODT_PORT
==
1
))))
begin
3411
//Rank0 Dynamic ODT disabled
3412
tmp_mr2_r
[
0
] <= #TCQ
2'b00
;
3413
//Rank0 RTT_NOM
3414
tmp_mr1_r
[
0
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3415
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3416
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3417
3'b000
;
3418
end
else
begin
3419
//Rank0 Dynamic ODT defaults to 120 ohms
3420
tmp_mr2_r
[
0
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3421
2'b10
;
3422
//Rank0 RTT_NOM after write leveling completes
3423
tmp_mr1_r
[
0
] <= #TCQ
3'b000
;
3424
end
3425
end
3426
3427
// Single slot configuration with dual rank
3428
4'b1100
:
begin
3429
phy_tmp_odt_r
<= #TCQ
4'b0001
;
3430
// Chip Select assignments
3431
3432
phy_tmp_cs1_r
[((
chip_cnt_r
*
nCS_PER_RANK
)
3433
) +:
nCS_PER_RANK
] <= #TCQ
'b0
;
3434
if
((
RTT_WR
==
"OFF"
) ||
3435
((
WRLVL
==
"ON"
) && ~
wrlvl_done
&&
3436
(
wrlvl_rank_cntr
==
3'd0
)))
begin
3437
//Rank0 Dynamic ODT disabled
3438
tmp_mr2_r
[
0
] <= #TCQ
2'b00
;
3439
//Rank0 Rtt_NOM
3440
tmp_mr1_r
[
0
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3441
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3442
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3443
3'b000
;
3444
end
else
begin
3445
//Rank0 Dynamic ODT defaults to 120 ohms
3446
tmp_mr2_r
[
0
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3447
2'b10
;
3448
//Rank0 Rtt_NOM after write leveling completes
3449
tmp_mr1_r
[
0
] <= #TCQ
3'b000
;
3450
end
3451
end
3452
3453
default
:
begin
3454
phy_tmp_odt_r
<= #TCQ
4'b0001
;
3455
phy_tmp_cs1_r
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
{
1'b0
}};
3456
if
((
RTT_WR
==
"OFF"
) ||
3457
((
WRLVL
==
"ON"
) && ~
wrlvl_done
))
begin
3458
//Rank0 Dynamic ODT disabled
3459
tmp_mr2_r
[
0
] <= #TCQ
2'b00
;
3460
//Rank0 Rtt_NOM
3461
tmp_mr1_r
[
0
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3462
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3463
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3464
3'b000
;
3465
end
else
begin
3466
//Rank0 Dynamic ODT defaults to 120 ohms
3467
tmp_mr2_r
[
0
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3468
2'b10
;
3469
//Rank0 Rtt_NOM after write leveling completes
3470
tmp_mr1_r
[
0
] <= #TCQ
3'b000
;
3471
end
3472
end
3473
endcase
3474
end
3475
end
3476
end
else
if
(
nSLOTS
==
2
)
begin
:
gen_dual_slot_odt
3477
always
@ (
posedge
clk
)
begin
3478
if
(
rst
)
begin
3479
tmp_mr2_r
[
1
] <= #TCQ
2'b00
;
3480
tmp_mr2_r
[
2
] <= #TCQ
2'b00
;
3481
tmp_mr2_r
[
3
] <= #TCQ
2'b00
;
3482
tmp_mr1_r
[
1
] <= #TCQ
3'b000
;
3483
tmp_mr1_r
[
2
] <= #TCQ
3'b000
;
3484
tmp_mr1_r
[
3
] <= #TCQ
3'b000
;
3485
phy_tmp_odt_r
<= #TCQ
4'b0000
;
3486
phy_tmp_cs1_r
<= #TCQ {
CS_WIDTH
*
nCS_PER_RANK
{
1'b1
}};
3487
phy_tmp_odt_r1
<= #TCQ
phy_tmp_odt_r
;
3488
end
else
begin
3489
case
({
slot_0_present
[
0
],
slot_0_present
[
1
],
3490
slot_1_present
[
0
],
slot_1_present
[
1
]})
3491
// Two slot configuration, one slot present, single rank
3492
4'b10_00
:
begin
3493
if
(
//wrlvl_odt ||
3494
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
3495
(
init_state_r
==
INIT_WRCAL_WRITE
) ||
3496
(
init_state_r
==
INIT_OCLKDELAY_WRITE
))
begin
3497
// odt turned on only during write
3498
phy_tmp_odt_r
<= #TCQ
4'b0001
;
3499
end
3500
phy_tmp_cs1_r
<= #TCQ {
nCS_PER_RANK
{
1'b0
}};
3501
if
((
RTT_WR
==
"OFF"
) ||
3502
((
WRLVL
==
"ON"
) && ~
wrlvl_done
))
begin
3503
//Rank0 Dynamic ODT disabled
3504
tmp_mr2_r
[
0
] <= #TCQ
2'b00
;
3505
//Rank0 Rtt_NOM
3506
tmp_mr1_r
[
0
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3507
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3508
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3509
3'b000
;
3510
end
else
begin
3511
//Rank0 Dynamic ODT defaults to 120 ohms
3512
tmp_mr2_r
[
0
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3513
2'b10
;
3514
//Rank0 Rtt_NOM after write leveling completes
3515
tmp_mr1_r
[
0
] <= #TCQ
3'b000
;
3516
end
3517
end
3518
4'b00_10
:
begin
3519
3520
//Rank1 ODT enabled
3521
if
(
//wrlvl_odt ||
3522
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
3523
(
init_state_r
==
INIT_WRCAL_WRITE
) ||
3524
(
init_state_r
==
INIT_OCLKDELAY_WRITE
))
begin
3525
// odt turned on only during write
3526
phy_tmp_odt_r
<= #TCQ
4'b0001
;
3527
end
3528
phy_tmp_cs1_r
<= #TCQ {
nCS_PER_RANK
{
1'b0
}};
3529
if
((
RTT_WR
==
"OFF"
) ||
3530
((
WRLVL
==
"ON"
) && ~
wrlvl_done
))
begin
3531
//Rank1 Dynamic ODT disabled
3532
tmp_mr2_r
[
0
] <= #TCQ
2'b00
;
3533
//Rank1 Rtt_NOM defaults to 120 ohms
3534
tmp_mr1_r
[
0
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3535
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3536
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3537
3'b000
;
3538
end
else
begin
3539
//Rank1 Dynamic ODT defaults to 120 ohms
3540
tmp_mr2_r
[
0
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3541
2'b10
;
3542
//Rank1 Rtt_NOM after write leveling completes
3543
tmp_mr1_r
[
0
] <= #TCQ
3'b000
;
3544
end
3545
end
3546
// Two slot configuration, one slot present, dual rank
3547
4'b00_11
:
begin
3548
if
(
//wrlvl_odt ||
3549
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
3550
(
init_state_r
==
INIT_WRCAL_WRITE
) ||
3551
(
init_state_r
==
INIT_OCLKDELAY_WRITE
))
begin
3552
// odt turned on only during write
3553
phy_tmp_odt_r
3554
<= #TCQ
4'b0001
;
3555
end
3556
3557
// Chip Select assignments
3558
phy_tmp_cs1_r
[(
chip_cnt_r
*
nCS_PER_RANK
) +:
nCS_PER_RANK
]
3559
<= #TCQ {
nCS_PER_RANK
{
1'b0
}};
3560
3561
if
((
RTT_WR
==
"OFF"
) ||
3562
((
WRLVL
==
"ON"
) && ~
wrlvl_done
&&
3563
(
wrlvl_rank_cntr
==
3'd0
)))
begin
3564
//Rank0 Dynamic ODT disabled
3565
tmp_mr2_r
[
0
] <= #TCQ
2'b00
;
3566
//Rank0 Rtt_NOM
3567
tmp_mr1_r
[
0
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3568
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3569
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3570
3'b000
;
3571
end
else
begin
3572
//Rank0 Dynamic ODT defaults to 120 ohms
3573
tmp_mr2_r
[
0
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3574
2'b10
;
3575
//Rank0 Rtt_NOM after write leveling completes
3576
tmp_mr1_r
[
0
] <= #TCQ
3'b000
;
3577
end
3578
end
3579
4'b11_00
:
begin
3580
if
(
//wrlvl_odt ||
3581
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
3582
(
init_state_r
==
INIT_WRCAL_WRITE
) ||
3583
(
init_state_r
==
INIT_OCLKDELAY_WRITE
))
begin
3584
// odt turned on only during write
3585
phy_tmp_odt_r
<= #TCQ
4'b0001
;
3586
end
3587
3588
// Chip Select assignments
3589
phy_tmp_cs1_r
[(
chip_cnt_r
*
nCS_PER_RANK
) +:
nCS_PER_RANK
]
3590
<= #TCQ {
nCS_PER_RANK
{
1'b0
}};
3591
3592
if
((
RTT_WR
==
"OFF"
) ||
3593
((
WRLVL
==
"ON"
) && ~
wrlvl_done
&&
3594
(
wrlvl_rank_cntr
==
3'd0
)))
begin
3595
//Rank1 Dynamic ODT disabled
3596
tmp_mr2_r
[
0
] <= #TCQ
2'b00
;
3597
//Rank1 Rtt_NOM
3598
tmp_mr1_r
[
0
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3599
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3600
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3601
3'b000
;
3602
end
else
begin
3603
//Rank1 Dynamic ODT defaults to 120 ohms
3604
tmp_mr2_r
[
0
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3605
2'b10
;
3606
//Rank1 Rtt_NOM after write leveling completes
3607
tmp_mr1_r
[
0
] <= #TCQ
3'b000
;
3608
end
3609
end
3610
// Two slot configuration, one rank per slot
3611
4'b10_10
:
begin
3612
if
(
DRAM_TYPE
==
"DDR2"
)
begin
3613
if
(
chip_cnt_r
==
2'b00
)
begin
3614
phy_tmp_odt_r
3615
<= #TCQ
4'b0010
;
//bit0 for rank0
3616
end
else
begin
3617
phy_tmp_odt_r
3618
<= #TCQ
4'b0001
;
//bit0 for rank0
3619
end
3620
end
else
begin
3621
if
(
init_state_r
==
INIT_WRLVL_WAIT
)
3622
phy_tmp_odt_r
<= #TCQ
4'b0011
;
// rank 0/1 odt0
3623
else
if
((
init_next_state
==
INIT_RDLVL_STG1_WRITE
) ||
3624
(
init_next_state
==
INIT_WRCAL_WRITE
) ||
3625
(
init_next_state
==
INIT_OCLKDELAY_WRITE
))
3626
phy_tmp_odt_r
<= #TCQ
4'b0011
;
// bit0 for rank0/1 (write)
3627
else
if
((
init_next_state
==
INIT_PI_PHASELOCK_READS
) ||
3628
(
init_next_state
==
INIT_MPR_READ
) ||
3629
(
init_next_state
==
INIT_RDLVL_STG1_READ
) ||
3630
(
init_next_state
==
INIT_RDLVL_STG2_READ
) ||
3631
(
init_next_state
==
INIT_OCLKDELAY_READ
) ||
3632
(
init_next_state
==
INIT_WRCAL_READ
) ||
3633
(
init_next_state
==
INIT_WRCAL_MULT_READS
))
3634
phy_tmp_odt_r
<= #TCQ
4'b0010
;
// bit0 for rank1 (rank 0 rd)
3635
end
3636
3637
// Chip Select assignments
3638
phy_tmp_cs1_r
[(
chip_cnt_r
*
nCS_PER_RANK
) +:
nCS_PER_RANK
]
3639
<= #TCQ {
nCS_PER_RANK
{
1'b0
}};
3640
3641
if
((
RTT_WR
==
"OFF"
) ||
3642
((
WRLVL
==
"ON"
) && ~
wrlvl_done
&&
3643
(
wrlvl_rank_cntr
==
3'd0
)))
begin
3644
//Rank0 Dynamic ODT disabled
3645
tmp_mr2_r
[
0
] <= #TCQ
2'b00
;
3646
//Rank0 Rtt_NOM
3647
tmp_mr1_r
[
0
] <= #TCQ (
RTT_WR
==
"60"
) ?
3'b001
:
3648
(
RTT_WR
==
"120"
) ?
3'b010
:
3649
3'b000
;
3650
//Rank1 Dynamic ODT disabled
3651
tmp_mr2_r
[
1
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3652
2'b10
;
3653
//Rank1 Rtt_NOM
3654
tmp_mr1_r
[
1
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3655
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3656
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3657
3'b000
;
3658
end
else
begin
3659
//Rank0 Dynamic ODT defaults to 120 ohms
3660
tmp_mr2_r
[
0
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3661
2'b10
;
3662
//Rank0 Rtt_NOM
3663
tmp_mr1_r
[
0
] <= #TCQ (
RTT_NOM_int
==
"60"
) ?
3'b001
:
3664
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3665
(
RTT_NOM_int
==
"20"
) ?
3'b100
:
3666
(
RTT_NOM_int
==
"30"
) ?
3'b101
:
3667
(
RTT_NOM_int
==
"40"
) ?
3'b011
:
3668
3'b000
;
3669
//Rank1 Dynamic ODT defaults to 120 ohms
3670
tmp_mr2_r
[
1
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3671
2'b10
;
3672
//Rank1 Rtt_NOM
3673
tmp_mr1_r
[
1
] <= #TCQ (
RTT_NOM_int
==
"60"
) ?
3'b001
:
3674
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3675
(
RTT_NOM_int
==
"20"
) ?
3'b100
:
3676
(
RTT_NOM_int
==
"30"
) ?
3'b101
:
3677
(
RTT_NOM_int
==
"40"
) ?
3'b011
:
3678
3'b000
;
3679
end
3680
end
3681
// Two Slots - One slot with dual rank and other with single rank
3682
4'b10_11
:
begin
3683
3684
//Rank3 Rtt_NOM
3685
tmp_mr1_r
[
2
] <= #TCQ (
RTT_NOM_int
==
"60"
) ?
3'b001
:
3686
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3687
(
RTT_NOM_int
==
"20"
) ?
3'b100
:
3688
(
RTT_NOM_int
==
"30"
) ?
3'b101
:
3689
(
RTT_NOM_int
==
"40"
) ?
3'b011
:
3690
3'b000
;
3691
tmp_mr2_r
[
2
] <= #TCQ
2'b00
;
3692
if
((
RTT_WR
==
"OFF"
) ||
3693
((
WRLVL
==
"ON"
) && ~
wrlvl_done
&&
3694
(
wrlvl_rank_cntr
==
3'd0
)))
begin
3695
//Rank0 Dynamic ODT disabled
3696
tmp_mr2_r
[
0
] <= #TCQ
2'b00
;
3697
//Rank0 Rtt_NOM
3698
tmp_mr1_r
[
0
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3699
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3700
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3701
3'b000
;
3702
//Rank1 Dynamic ODT disabled
3703
tmp_mr2_r
[
1
] <= #TCQ
2'b00
;
3704
//Rank1 Rtt_NOM
3705
tmp_mr1_r
[
1
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3706
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3707
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3708
3'b000
;
3709
end
else
begin
3710
//Rank0 Dynamic ODT defaults to 120 ohms
3711
tmp_mr2_r
[
0
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3712
2'b10
;
3713
//Rank0 Rtt_NOM after write leveling completes
3714
tmp_mr1_r
[
0
] <= #TCQ (
RTT_NOM_int
==
"60"
) ?
3'b001
:
3715
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3716
(
RTT_NOM_int
==
"20"
) ?
3'b100
:
3717
(
RTT_NOM_int
==
"30"
) ?
3'b101
:
3718
(
RTT_NOM_int
==
"40"
) ?
3'b011
:
3719
3'b000
;
3720
//Rank1 Dynamic ODT defaults to 120 ohms
3721
tmp_mr2_r
[
1
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3722
2'b10
;
3723
//Rank1 Rtt_NOM after write leveling completes
3724
tmp_mr1_r
[
1
] <= #TCQ
3'b000
;
3725
end
3726
//Slot1 Rank1 or Rank3 is being written
3727
if
(
DRAM_TYPE
==
"DDR2"
)
begin
3728
if
(
chip_cnt_r
==
2'b00
)
begin
3729
phy_tmp_odt_r
3730
<= #TCQ
4'b0010
;
3731
end
else
begin
3732
phy_tmp_odt_r
3733
<= #TCQ
4'b0001
;
3734
end
3735
end
else
begin
3736
if
(
//wrlvl_odt ||
3737
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
3738
(
init_state_r
==
INIT_WRCAL_WRITE
) ||
3739
(
init_state_r
==
INIT_OCLKDELAY_WRITE
))
begin
3740
if
(
chip_cnt_r
[
0
] ==
1'b1
)
begin
3741
phy_tmp_odt_r
3742
<= #TCQ
4'b0011
;
3743
//Slot0 Rank0 is being written
3744
end
else
begin
3745
phy_tmp_odt_r
3746
<= #TCQ
4'b0101
;
// ODT for ranks 0 and 2 aserted
3747
end
3748
end
else
if
((
init_state_r
==
INIT_RDLVL_STG1_READ
)
3749
|| (
init_state_r
==
INIT_PI_PHASELOCK_READS
) ||
3750
(
init_state_r
==
INIT_RDLVL_STG2_READ
) ||
3751
(
init_state_r
==
INIT_OCLKDELAY_READ
) ||
3752
(
init_state_r
==
INIT_WRCAL_READ
) ||
3753
(
init_state_r
==
INIT_WRCAL_MULT_READS
))
begin
3754
if
(
chip_cnt_r
==
2'b00
)
begin
3755
phy_tmp_odt_r
3756
<= #TCQ
4'b0100
;
3757
end
else
begin
3758
phy_tmp_odt_r
3759
<= #TCQ
4'b0001
;
3760
end
3761
end
3762
end
3763
3764
// Chip Select assignments
3765
phy_tmp_cs1_r
[(
chip_cnt_r
*
nCS_PER_RANK
) +:
nCS_PER_RANK
]
3766
<= #TCQ {
nCS_PER_RANK
{
1'b0
}};
3767
3768
end
3769
// Two Slots - One slot with dual rank and other with single rank
3770
4'b11_10
:
begin
3771
3772
//Rank2 Rtt_NOM
3773
tmp_mr1_r
[
2
] <= #TCQ (
RTT_NOM2
==
"60"
) ?
3'b001
:
3774
(
RTT_NOM2
==
"120"
) ?
3'b010
:
3775
(
RTT_NOM2
==
"20"
) ?
3'b100
:
3776
(
RTT_NOM2
==
"30"
) ?
3'b101
:
3777
(
RTT_NOM2
==
"40"
) ?
3'b011
:
3778
3'b000
;
3779
tmp_mr2_r
[
2
] <= #TCQ
2'b00
;
3780
if
((
RTT_WR
==
"OFF"
) ||
3781
((
WRLVL
==
"ON"
) && ~
wrlvl_done
&&
3782
(
wrlvl_rank_cntr
==
3'd0
)))
begin
3783
//Rank0 Dynamic ODT disabled
3784
tmp_mr2_r
[
0
] <= #TCQ
2'b00
;
3785
//Rank0 Rtt_NOM
3786
tmp_mr1_r
[
0
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3787
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3788
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3789
3'b000
;
3790
//Rank1 Dynamic ODT disabled
3791
tmp_mr2_r
[
1
] <= #TCQ
2'b00
;
3792
//Rank1 Rtt_NOM
3793
tmp_mr1_r
[
1
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3794
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3795
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3796
3'b000
;
3797
end
else
begin
3798
//Rank1 Dynamic ODT defaults to 120 ohms
3799
tmp_mr2_r
[
1
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3800
2'b10
;
3801
//Rank1 Rtt_NOM
3802
tmp_mr1_r
[
1
] <= #TCQ (
RTT_NOM_int
==
"60"
) ?
3'b001
:
3803
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3804
(
RTT_NOM_int
==
"20"
) ?
3'b100
:
3805
(
RTT_NOM_int
==
"30"
) ?
3'b101
:
3806
(
RTT_NOM_int
==
"40"
) ?
3'b011
:
3807
3'b000
;
3808
//Rank0 Dynamic ODT defaults to 120 ohms
3809
tmp_mr2_r
[
0
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3810
2'b10
;
3811
//Rank0 Rtt_NOM after write leveling completes
3812
tmp_mr1_r
[
0
] <= #TCQ
3'b000
;
3813
end
3814
3815
if
(
DRAM_TYPE
==
"DDR2"
)
begin
3816
if
(
chip_cnt_r
[
1
] ==
1'b1
)
begin
3817
phy_tmp_odt_r
<=
3818
#TCQ
4'b0001
;
3819
end
else
begin
3820
phy_tmp_odt_r
3821
<= #TCQ
4'b0100
;
// rank 2 ODT asserted
3822
end
3823
end
else
begin
3824
if
(
// wrlvl_odt ||
3825
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
3826
(
init_state_r
==
INIT_WRCAL_WRITE
) ||
3827
(
init_state_r
==
INIT_OCLKDELAY_WRITE
))
begin
3828
3829
if
(
chip_cnt_r
[
1
] ==
1'b1
)
begin
3830
phy_tmp_odt_r
3831
<= #TCQ
4'b0110
;
3832
end
else
begin
3833
phy_tmp_odt_r
<=
3834
#TCQ
4'b0101
;
3835
end
3836
end
else
if
((
init_state_r
==
INIT_RDLVL_STG1_READ
) ||
3837
(
init_state_r
==
INIT_PI_PHASELOCK_READS
) ||
3838
(
init_state_r
==
INIT_RDLVL_STG2_READ
) ||
3839
(
init_state_r
==
INIT_OCLKDELAY_READ
) ||
3840
(
init_state_r
==
INIT_WRCAL_READ
) ||
3841
(
init_state_r
==
INIT_WRCAL_MULT_READS
))
begin
3842
3843
if
(
chip_cnt_r
[
1
] ==
1'b1
)
begin
3844
phy_tmp_odt_r
[(
1
*
nCS_PER_RANK
) +:
nCS_PER_RANK
]
3845
<= #TCQ
4'b0010
;
3846
end
else
begin
3847
phy_tmp_odt_r
3848
<= #TCQ
4'b0100
;
3849
end
3850
end
3851
end
3852
3853
// Chip Select assignments
3854
phy_tmp_cs1_r
[(
chip_cnt_r
*
nCS_PER_RANK
) +:
nCS_PER_RANK
]
3855
<= #TCQ {
nCS_PER_RANK
{
1'b0
}};
3856
end
3857
// Two Slots - two ranks per slot
3858
4'b11_11
:
begin
3859
//Rank2 Rtt_NOM
3860
tmp_mr1_r
[
2
] <= #TCQ (
RTT_NOM2
==
"60"
) ?
3'b001
:
3861
(
RTT_NOM2
==
"120"
) ?
3'b010
:
3862
(
RTT_NOM2
==
"20"
) ?
3'b100
:
3863
(
RTT_NOM2
==
"30"
) ?
3'b101
:
3864
(
RTT_NOM2
==
"40"
) ?
3'b011
:
3865
3'b000
;
3866
//Rank3 Rtt_NOM
3867
tmp_mr1_r
[
3
] <= #TCQ (
RTT_NOM3
==
"60"
) ?
3'b001
:
3868
(
RTT_NOM3
==
"120"
) ?
3'b010
:
3869
(
RTT_NOM3
==
"20"
) ?
3'b100
:
3870
(
RTT_NOM3
==
"30"
) ?
3'b101
:
3871
(
RTT_NOM3
==
"40"
) ?
3'b011
:
3872
3'b000
;
3873
tmp_mr2_r
[
2
] <= #TCQ
2'b00
;
3874
tmp_mr2_r
[
3
] <= #TCQ
2'b00
;
3875
if
((
RTT_WR
==
"OFF"
) ||
3876
((
WRLVL
==
"ON"
) && ~
wrlvl_done
&&
3877
(
wrlvl_rank_cntr
==
3'd0
)))
begin
3878
//Rank0 Dynamic ODT disabled
3879
tmp_mr2_r
[
0
] <= #TCQ
2'b00
;
3880
//Rank0 Rtt_NOM
3881
tmp_mr1_r
[
0
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3882
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3883
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3884
3'b000
;
3885
//Rank1 Dynamic ODT disabled
3886
tmp_mr2_r
[
1
] <= #TCQ
2'b00
;
3887
//Rank1 Rtt_NOM
3888
tmp_mr1_r
[
1
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3889
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3890
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3891
3'b000
;
3892
end
else
begin
3893
//Rank1 Dynamic ODT defaults to 120 ohms
3894
tmp_mr2_r
[
1
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3895
2'b10
;
3896
//Rank1 Rtt_NOM after write leveling completes
3897
tmp_mr1_r
[
1
] <= #TCQ
3'b000
;
3898
//Rank0 Dynamic ODT defaults to 120 ohms
3899
tmp_mr2_r
[
0
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3900
2'b10
;
3901
//Rank0 Rtt_NOM after write leveling completes
3902
tmp_mr1_r
[
0
] <= #TCQ
3'b000
;
3903
end
3904
3905
if
(
DRAM_TYPE
==
"DDR2"
)
begin
3906
if
(
chip_cnt_r
[
1
] ==
1'b1
)
begin
3907
phy_tmp_odt_r
3908
<= #TCQ
4'b0001
;
3909
end
else
begin
3910
phy_tmp_odt_r
3911
<= #TCQ
4'b0100
;
3912
end
3913
end
else
begin
3914
if
(
//wrlvl_odt ||
3915
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
3916
(
init_state_r
==
INIT_WRCAL_WRITE
) ||
3917
(
init_state_r
==
INIT_OCLKDELAY_WRITE
))
begin
3918
//Slot1 Rank1 or Rank3 is being written
3919
if
(
chip_cnt_r
[
0
] ==
1'b1
)
begin
3920
phy_tmp_odt_r
3921
<= #TCQ
4'b0110
;
3922
//Slot0 Rank0 or Rank2 is being written
3923
end
else
begin
3924
phy_tmp_odt_r
3925
<= #TCQ
4'b1001
;
3926
end
3927
end
else
if
((
init_state_r
==
INIT_RDLVL_STG1_READ
) ||
3928
(
init_state_r
==
INIT_PI_PHASELOCK_READS
) ||
3929
(
init_state_r
==
INIT_RDLVL_STG2_READ
) ||
3930
(
init_state_r
==
INIT_OCLKDELAY_READ
) ||
3931
(
init_state_r
==
INIT_WRCAL_READ
) ||
3932
(
init_state_r
==
INIT_WRCAL_MULT_READS
))
begin
3933
//Slot1 Rank1 or Rank3 is being read
3934
if
(
chip_cnt_r
[
0
] ==
1'b1
)
begin
3935
phy_tmp_odt_r
3936
<= #TCQ
4'b0100
;
3937
//Slot0 Rank0 or Rank2 is being read
3938
end
else
begin
3939
phy_tmp_odt_r
3940
<= #TCQ
4'b1000
;
3941
end
3942
end
3943
end
3944
3945
// Chip Select assignments
3946
phy_tmp_cs1_r
[(
chip_cnt_r
*
nCS_PER_RANK
) +:
nCS_PER_RANK
]
3947
<= #TCQ {
nCS_PER_RANK
{
1'b0
}};
3948
end
3949
default
:
begin
3950
phy_tmp_odt_r
<= #TCQ
4'b1111
;
3951
// Chip Select assignments
3952
phy_tmp_cs1_r
[(
chip_cnt_r
*
nCS_PER_RANK
) +:
nCS_PER_RANK
]
3953
<= #TCQ {
nCS_PER_RANK
{
1'b0
}};
3954
if
((
RTT_WR
==
"OFF"
) ||
3955
((
WRLVL
==
"ON"
) && ~
wrlvl_done
))
begin
3956
//Rank0 Dynamic ODT disabled
3957
tmp_mr2_r
[
0
] <= #TCQ
2'b00
;
3958
//Rank0 Rtt_NOM
3959
tmp_mr1_r
[
0
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3960
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3961
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3962
3'b000
;
3963
//Rank1 Dynamic ODT disabled
3964
tmp_mr2_r
[
1
] <= #TCQ
2'b00
;
3965
//Rank1 Rtt_NOM
3966
tmp_mr1_r
[
1
] <= #TCQ (
RTT_NOM_int
==
"40"
) ?
3'b011
:
3967
(
RTT_NOM_int
==
"60"
) ?
3'b001
:
3968
(
RTT_NOM_int
==
"60"
) ?
3'b010
:
3969
3'b000
;
3970
end
else
begin
3971
//Rank0 Dynamic ODT defaults to 120 ohms
3972
tmp_mr2_r
[
0
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3973
2'b10
;
3974
//Rank0 Rtt_NOM
3975
tmp_mr1_r
[
0
] <= #TCQ (
RTT_NOM_int
==
"60"
) ?
3'b001
:
3976
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3977
(
RTT_NOM_int
==
"20"
) ?
3'b100
:
3978
(
RTT_NOM_int
==
"30"
) ?
3'b101
:
3979
(
RTT_NOM_int
==
"40"
) ?
3'b011
:
3980
3'b000
;
3981
//Rank1 Dynamic ODT defaults to 120 ohms
3982
tmp_mr2_r
[
1
] <= #TCQ (
RTT_WR
==
"60"
) ?
2'b01
:
3983
2'b10
;
3984
//Rank1 Rtt_NOM
3985
tmp_mr1_r
[
1
] <= #TCQ (
RTT_NOM_int
==
"60"
) ?
3'b001
:
3986
(
RTT_NOM_int
==
"120"
) ?
3'b010
:
3987
(
RTT_NOM_int
==
"20"
) ?
3'b100
:
3988
(
RTT_NOM_int
==
"30"
) ?
3'b101
:
3989
(
RTT_NOM_int
==
"40"
) ?
3'b011
:
3990
3'b000
;
3991
end
3992
end
3993
endcase
3994
end
3995
end
3996
end
3997
endgenerate
3998
3999
4000
// PHY only supports two ranks.
4001
// calib_aux_out[0] is CKE for rank 0 and calib_aux_out[1] is ODT for rank 0
4002
// calib_aux_out[2] is CKE for rank 1 and calib_aux_out[3] is ODT for rank 1
4003
4004
generate
4005
if
(
CKE_ODT_AUX
==
"FALSE"
)
begin
4006
if
((
nSLOTS
==
1
) && (
RANKS
<
2
))
begin
4007
always
@(
posedge
clk
)
4008
if
(
rst
)
begin
4009
calib_cke
<= #TCQ {
nCK_PER_CLK
{
1'b0
}} ;
4010
calib_odt
<=
2'b00
;
4011
end
else
begin
4012
if
(
cnt_pwron_cke_done_r
/*&& ~cnt_pwron_cke_done_r1**/
)
begin
4013
calib_cke
<= #TCQ {
nCK_PER_CLK
{
1'b1
}};
4014
end
else
begin
4015
calib_cke
<= #TCQ {
nCK_PER_CLK
{
1'b0
}};
4016
end
4017
if
((((
RTT_NOM
==
"DISABLED"
) && (
RTT_WR
==
"OFF"
))
/* ||
4018
wrlvl_rank_done || wrlvl_rank_done_r1 ||
4019
(wrlvl_done && !wrlvl_done_r)**/
) && (
DRAM_TYPE
==
"DDR3"
))
begin
4020
calib_odt
[
0
] <= #TCQ
1'b0
;
4021
calib_odt
[
1
] <= #TCQ
1'b0
;
4022
end
else
if
(((
DRAM_TYPE
==
"DDR3"
)
4023
||((
RTT_NOM
!=
"DISABLED"
) && (
DRAM_TYPE
==
"DDR2"
)))
4024
&& (((
init_state_r
==
INIT_WRLVL_WAIT
) &&
wrlvl_odt
) ||
4025
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
4026
(
init_state_r
==
INIT_RDLVL_STG1_WRITE_READ
) ||
4027
(
init_state_r
==
INIT_WRCAL_WRITE
) ||
4028
(
init_state_r
==
INIT_WRCAL_WRITE_READ
) ||
4029
(
init_state_r
==
INIT_OCLKDELAY_WRITE
)||
4030
(
init_state_r
==
INIT_OCLKDELAY_WRITE_WAIT
)))
begin
4031
// Quad rank in a single slot
4032
calib_odt
[
0
] <= #TCQ
phy_tmp_odt_r
[
0
];
4033
calib_odt
[
1
] <= #TCQ
phy_tmp_odt_r
[
1
];
4034
end
else
begin
4035
calib_odt
[
0
] <= #TCQ
1'b0
;
4036
calib_odt
[
1
] <= #TCQ
1'b0
;
4037
end
4038
end
4039
end
else
if
((
nSLOTS
==
1
) && (
RANKS
<=
2
))
begin
4040
always
@(
posedge
clk
)
4041
if
(
rst
)
begin
4042
calib_cke
<= #TCQ {
nCK_PER_CLK
{
1'b0
}} ;
4043
calib_odt
<=
2'b00
;
4044
end
else
begin
4045
if
(
cnt_pwron_cke_done_r
/*&& ~cnt_pwron_cke_done_r1**/
)
begin
4046
calib_cke
<= #TCQ {
nCK_PER_CLK
{
1'b1
}};
4047
end
else
begin
4048
calib_cke
<= #TCQ {
nCK_PER_CLK
{
1'b0
}};
4049
end
4050
if
((((
RTT_NOM
==
"DISABLED"
) && (
RTT_WR
==
"OFF"
))
/* ||
4051
wrlvl_rank_done_r2 ||
4052
(wrlvl_done && !wrlvl_done_r)**/
) && (
DRAM_TYPE
==
"DDR3"
))
begin
4053
calib_odt
[
0
] <= #TCQ
1'b0
;
4054
calib_odt
[
1
] <= #TCQ
1'b0
;
4055
end
else
if
(((
DRAM_TYPE
==
"DDR3"
)
4056
||((
RTT_NOM
!=
"DISABLED"
) && (
DRAM_TYPE
==
"DDR2"
)))
4057
&& (((
init_state_r
==
INIT_WRLVL_WAIT
) &&
wrlvl_odt
)||
4058
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
4059
(
init_state_r
==
INIT_RDLVL_STG1_WRITE_READ
) ||
4060
(
init_state_r
==
INIT_WRCAL_WRITE
) ||
4061
(
init_state_r
==
INIT_WRCAL_WRITE_READ
) ||
4062
(
init_state_r
==
INIT_OCLKDELAY_WRITE
)||
4063
(
init_state_r
==
INIT_OCLKDELAY_WRITE_WAIT
)))
begin
4064
// Dual rank in a single slot
4065
calib_odt
[
0
] <= #TCQ
phy_tmp_odt_r
[
0
];
4066
calib_odt
[
1
] <= #TCQ
phy_tmp_odt_r
[
1
];
4067
end
else
begin
4068
calib_odt
[
0
] <= #TCQ
1'b0
;
4069
calib_odt
[
1
] <= #TCQ
1'b0
;
4070
end
4071
end
4072
end
else
if
((
nSLOTS
==
2
) && (
RANKS
==
2
))
begin
4073
always
@(
posedge
clk
)
4074
if
(
rst
)
begin
4075
calib_cke
<= #TCQ {
nCK_PER_CLK
{
1'b0
}} ;
4076
calib_odt
<=
2'b00
;
4077
end
else
begin
4078
if
(
cnt_pwron_cke_done_r
/*&& ~cnt_pwron_cke_done_r1**/
)
begin
4079
calib_cke
<= #TCQ {
nCK_PER_CLK
{
1'b1
}};
4080
end
else
begin
4081
calib_cke
<= #TCQ {
nCK_PER_CLK
{
1'b0
}};
4082
end
4083
if
(((
DRAM_TYPE
==
"DDR2"
) && (
RTT_NOM
==
"DISABLED"
)) ||
4084
((
DRAM_TYPE
==
"DDR3"
) &&
4085
(
RTT_NOM
==
"DISABLED"
) && (
RTT_WR
==
"OFF"
)))
begin
4086
calib_odt
[
0
] <= #TCQ
1'b0
;
4087
calib_odt
[
1
] <= #TCQ
1'b0
;
4088
end
else
if
(((
init_state_r
==
INIT_WRLVL_WAIT
) &&
wrlvl_odt
) ||
4089
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
4090
(
init_state_r
==
INIT_WRCAL_WRITE
) ||
4091
(
init_state_r
==
INIT_OCLKDELAY_WRITE
))
begin
4092
// Quad rank in a single slot
4093
if
(
nCK_PER_CLK
==
2
)
begin
4094
calib_odt
[
0
]
4095
<= #TCQ (!
calib_odt
[
0
]) ?
phy_tmp_odt_r
[
0
] :
1'b0
;
4096
calib_odt
[
1
]
4097
<= #TCQ (!
calib_odt
[
1
]) ?
phy_tmp_odt_r
[
1
] :
1'b0
;
4098
end
else
begin
4099
calib_odt
[
0
] <= #TCQ
phy_tmp_odt_r
[
0
];
4100
calib_odt
[
1
] <= #TCQ
phy_tmp_odt_r
[
1
];
4101
end
4102
// Turn on for idle rank during read if dynamic ODT is enabled in DDR3
4103
end
else
if
(((
DRAM_TYPE
==
"DDR3"
) && (
RTT_WR
!=
"OFF"
)) &&
4104
((
init_state_r
==
INIT_PI_PHASELOCK_READS
) ||
4105
(
init_state_r
==
INIT_MPR_READ
) ||
4106
(
init_state_r
==
INIT_RDLVL_STG1_READ
) ||
4107
(
init_state_r
==
INIT_RDLVL_STG2_READ
) ||
4108
(
init_state_r
==
INIT_OCLKDELAY_READ
) ||
4109
(
init_state_r
==
INIT_WRCAL_READ
) ||
4110
(
init_state_r
==
INIT_WRCAL_MULT_READS
)))
begin
4111
if
(
nCK_PER_CLK
==
2
)
begin
4112
calib_odt
[
0
]
4113
<= #TCQ (!
calib_odt
[
0
]) ?
phy_tmp_odt_r
[
0
] :
1'b0
;
4114
calib_odt
[
1
]
4115
<= #TCQ (!
calib_odt
[
1
]) ?
phy_tmp_odt_r
[
1
] :
1'b0
;
4116
end
else
begin
4117
calib_odt
[
0
] <= #TCQ
phy_tmp_odt_r
[
0
];
4118
calib_odt
[
1
] <= #TCQ
phy_tmp_odt_r
[
1
];
4119
end
4120
// disable well before next command and before disabling write leveling
4121
end
else
if
(
cnt_cmd_done_m7_r
||
4122
(
init_state_r
==
INIT_WRLVL_WAIT
&& ~
wrlvl_odt
))
4123
calib_odt
<= #TCQ
2'b00
;
4124
end
4125
end
4126
end
else
begin
//USE AUX OUTPUT for routing CKE and ODT.
4127
if
((
nSLOTS
==
1
) && (
RANKS
<
2
))
begin
4128
always
@(
posedge
clk
)
4129
if
(
rst
)
begin
4130
calib_aux_out
<= #TCQ
4'b0000
;
4131
end
else
begin
4132
if
(
cnt_pwron_cke_done_r
&& ~
cnt_pwron_cke_done_r1
)
begin
4133
calib_aux_out
[
0
] <= #TCQ
1'b1
;
4134
calib_aux_out
[
2
] <= #TCQ
1'b1
;
4135
end
else
begin
4136
calib_aux_out
[
0
] <= #TCQ
1'b0
;
4137
calib_aux_out
[
2
] <= #TCQ
1'b0
;
4138
end
4139
if
((((
RTT_NOM
==
"DISABLED"
) && (
RTT_WR
==
"OFF"
)) ||
4140
wrlvl_rank_done
||
wrlvl_rank_done_r1
||
4141
(
wrlvl_done
&& !
wrlvl_done_r
)) && (
DRAM_TYPE
==
"DDR3"
))
begin
4142
calib_aux_out
[
1
] <= #TCQ
1'b0
;
4143
calib_aux_out
[
3
] <= #TCQ
1'b0
;
4144
end
else
if
(((
DRAM_TYPE
==
"DDR3"
)
4145
||((
RTT_NOM
!=
"DISABLED"
) && (
DRAM_TYPE
==
"DDR2"
)))
4146
&& (((
init_state_r
==
INIT_WRLVL_WAIT
) &&
wrlvl_odt
) ||
4147
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
4148
(
init_state_r
==
INIT_WRCAL_WRITE
) ||
4149
(
init_state_r
==
INIT_OCLKDELAY_WRITE
)))
begin
4150
// Quad rank in a single slot
4151
calib_aux_out
[
1
] <= #TCQ
phy_tmp_odt_r
[
0
];
4152
calib_aux_out
[
3
] <= #TCQ
phy_tmp_odt_r
[
1
];
4153
end
else
begin
4154
calib_aux_out
[
1
] <= #TCQ
1'b0
;
4155
calib_aux_out
[
3
] <= #TCQ
1'b0
;
4156
end
4157
end
4158
end
else
if
((
nSLOTS
==
1
) && (
RANKS
<=
2
))
begin
4159
always
@(
posedge
clk
)
4160
if
(
rst
)
begin
4161
calib_aux_out
<= #TCQ
4'b0000
;
4162
end
else
begin
4163
if
(
cnt_pwron_cke_done_r
&& ~
cnt_pwron_cke_done_r1
)
begin
4164
calib_aux_out
[
0
] <= #TCQ
1'b1
;
4165
calib_aux_out
[
2
] <= #TCQ
1'b1
;
4166
end
else
begin
4167
calib_aux_out
[
0
] <= #TCQ
1'b0
;
4168
calib_aux_out
[
2
] <= #TCQ
1'b0
;
4169
end
4170
if
((((
RTT_NOM
==
"DISABLED"
) && (
RTT_WR
==
"OFF"
)) ||
4171
wrlvl_rank_done_r2
||
4172
(
wrlvl_done
&& !
wrlvl_done_r
)) && (
DRAM_TYPE
==
"DDR3"
))
begin
4173
calib_aux_out
[
1
] <= #TCQ
1'b0
;
4174
calib_aux_out
[
3
] <= #TCQ
1'b0
;
4175
end
else
if
(((
DRAM_TYPE
==
"DDR3"
)
4176
||((
RTT_NOM
!=
"DISABLED"
) && (
DRAM_TYPE
==
"DDR2"
)))
4177
&& (((
init_state_r
==
INIT_WRLVL_WAIT
) &&
wrlvl_odt
) ||
4178
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
4179
(
init_state_r
==
INIT_WRCAL_WRITE
) ||
4180
(
init_state_r
==
INIT_OCLKDELAY_WRITE
)))
begin
4181
// Dual rank in a single slot
4182
calib_aux_out
[
1
] <= #TCQ
phy_tmp_odt_r
[
0
];
4183
calib_aux_out
[
3
] <= #TCQ
phy_tmp_odt_r
[
1
];
4184
end
else
begin
4185
calib_aux_out
[
1
] <= #TCQ
1'b0
;
4186
calib_aux_out
[
3
] <= #TCQ
1'b0
;
4187
end
4188
end
4189
end
else
if
((
nSLOTS
==
2
) && (
RANKS
==
2
))
begin
4190
always
@(
posedge
clk
)
4191
if
(
rst
)
4192
calib_aux_out
<= #TCQ
4'b0000
;
4193
else
begin
4194
if
(
cnt_pwron_cke_done_r
&& ~
cnt_pwron_cke_done_r1
)
begin
4195
calib_aux_out
[
0
] <= #TCQ
1'b1
;
4196
calib_aux_out
[
2
] <= #TCQ
1'b1
;
4197
end
else
begin
4198
calib_aux_out
[
0
] <= #TCQ
1'b0
;
4199
calib_aux_out
[
2
] <= #TCQ
1'b0
;
4200
end
4201
if
((((
RTT_NOM
==
"DISABLED"
) && (
RTT_WR
==
"OFF"
)) ||
4202
wrlvl_rank_done_r2
||
4203
(
wrlvl_done
&& !
wrlvl_done_r
)) && (
DRAM_TYPE
==
"DDR3"
))
begin
4204
calib_aux_out
[
1
] <= #TCQ
1'b0
;
4205
calib_aux_out
[
3
] <= #TCQ
1'b0
;
4206
end
else
if
(((
DRAM_TYPE
==
"DDR3"
)
4207
||((
RTT_NOM
!=
"DISABLED"
) && (
DRAM_TYPE
==
"DDR2"
)))
4208
&& (((
init_state_r
==
INIT_WRLVL_WAIT
) &&
wrlvl_odt
) ||
4209
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
4210
(
init_state_r
==
INIT_WRCAL_WRITE
) ||
4211
(
init_state_r
==
INIT_OCLKDELAY_WRITE
)))
begin
4212
// Quad rank in a single slot
4213
if
(
nCK_PER_CLK
==
2
)
begin
4214
calib_aux_out
[
1
]
4215
<= #TCQ (!
calib_aux_out
[
1
]) ?
phy_tmp_odt_r
[
0
] :
1'b0
;
4216
calib_aux_out
[
3
]
4217
<= #TCQ (!
calib_aux_out
[
3
]) ?
phy_tmp_odt_r
[
1
] :
1'b0
;
4218
end
else
begin
4219
calib_aux_out
[
1
] <= #TCQ
phy_tmp_odt_r
[
0
];
4220
calib_aux_out
[
3
] <= #TCQ
phy_tmp_odt_r
[
1
];
4221
end
4222
end
else
begin
4223
calib_aux_out
[
1
] <= #TCQ
1'b0
;
4224
calib_aux_out
[
3
] <= #TCQ
1'b0
;
4225
end
4226
end
4227
end
4228
end
4229
endgenerate
4230
4231
//*****************************************************************
4232
// memory address during init
4233
//*****************************************************************
4234
4235
always
@(
posedge
clk
)
4236
phy_data_full_r
<= #TCQ
phy_data_full
;
4237
4238
always
@(
burst_addr_r
or
cnt_init_mr_r
or
chip_cnt_r
or
wrcal_wr_cnt
4239
or
ddr2_refresh_flag_r
or
init_state_r
or
load_mr0
or
phy_data_full_r
4240
or
load_mr1
or
load_mr2
or
load_mr3
or
new_burst_r
or
phy_address
4241
or
mr1_r
[
0
][
0
]
or
mr1_r
[
0
][
1
]
or
mr1_r
[
0
][
2
]
4242
or
mr1_r
[
1
][
0
]
or
mr1_r
[
1
][
1
]
or
mr1_r
[
1
][
2
]
4243
or
mr1_r
[
2
][
0
]
or
mr1_r
[
2
][
1
]
or
mr1_r
[
2
][
2
]
4244
or
mr1_r
[
3
][
0
]
or
mr1_r
[
3
][
1
]
or
mr1_r
[
3
][
2
]
4245
or
mr2_r
[
chip_cnt_r
]
or
reg_ctrl_cnt_r
or
stg1_wr_rd_cnt
or
oclk_wr_cnt
4246
or
rdlvl_stg1_done
or
prbs_rdlvl_done
or
pi_dqs_found_done
or
rdlvl_wr_rd
)
begin
4247
// Bus 0 for address/bank never used
4248
address_w
=
'b0
;
4249
bank_w
=
'b0
;
4250
if
((
init_state_r
==
INIT_PRECHARGE
) ||
4251
(
init_state_r
==
INIT_ZQCL
) ||
4252
(
init_state_r
==
INIT_DDR2_PRECHARGE
))
begin
4253
// Set A10=1 for ZQ long calibration or Precharge All
4254
address_w
=
'b0
;
4255
address_w
[
10
] =
1'b1
;
4256
bank_w
=
'b0
;
4257
end
else
if
(
init_state_r
==
INIT_WRLVL_START
)
begin
4258
// Enable wrlvl in MR1
4259
bank_w
[
1
:
0
] =
2'b01
;
4260
address_w
=
load_mr1
[
ROW_WIDTH
-
1
:
0
];
4261
address_w
[
2
] =
mr1_r
[
chip_cnt_r
][
0
];
4262
address_w
[
6
] =
mr1_r
[
chip_cnt_r
][
1
];
4263
address_w
[
9
] =
mr1_r
[
chip_cnt_r
][
2
];
4264
address_w
[
7
] =
1'b1
;
4265
end
else
if
(
init_state_r
==
INIT_WRLVL_LOAD_MR
)
begin
4266
// Finished with write leveling, disable wrlvl in MR1
4267
// For single rank disable Rtt_Nom
4268
bank_w
[
1
:
0
] =
2'b01
;
4269
address_w
=
load_mr1
[
ROW_WIDTH
-
1
:
0
];
4270
address_w
[
2
] =
mr1_r
[
chip_cnt_r
][
0
];
4271
address_w
[
6
] =
mr1_r
[
chip_cnt_r
][
1
];
4272
address_w
[
9
] =
mr1_r
[
chip_cnt_r
][
2
];
4273
end
else
if
(
init_state_r
==
INIT_WRLVL_LOAD_MR2
)
begin
4274
// Set RTT_WR in MR2 after write leveling disabled
4275
bank_w
[
1
:
0
] =
2'b10
;
4276
address_w
=
load_mr2
[
ROW_WIDTH
-
1
:
0
];
4277
address_w
[
10
:
9
] =
mr2_r
[
chip_cnt_r
];
4278
end
else
if
(
init_state_r
==
INIT_MPR_READ
)
begin
4279
address_w
=
'b0
;
4280
bank_w
=
'b0
;
4281
end
else
if
(
init_state_r
==
INIT_MPR_RDEN
)
begin
4282
// Enable MPR read with LMR3 and A2=1
4283
bank_w
[
BANK_WIDTH
-
1
:
0
] =
'd3
;
4284
address_w
= {
ROW_WIDTH
{
1'b0
}};
4285
address_w
[
2
] =
1'b1
;
4286
end
else
if
(
init_state_r
==
INIT_MPR_DISABLE
)
begin
4287
// Disable MPR read with LMR3 and A2=0
4288
bank_w
[
BANK_WIDTH
-
1
:
0
] =
'd3
;
4289
address_w
= {
ROW_WIDTH
{
1'b0
}};
4290
end
else
if
((
init_state_r
==
INIT_REG_WRITE
)&
4291
(
DRAM_TYPE
==
"DDR3"
))
begin
4292
// bank_w is assigned a 3 bit value. In some
4293
// DDR2 cases there will be only two bank bits.
4294
//Qualifying the condition with DDR3
4295
bank_w
=
'b0
;
4296
address_w
=
'b0
;
4297
case
(
reg_ctrl_cnt_r
)
4298
REG_RC0
[
2
:
0
]:
address_w
[
4
:
0
] =
REG_RC0
[
4
:
0
];
4299
REG_RC1
[
2
:
0
]:
begin
4300
address_w
[
4
:
0
] =
REG_RC1
[
4
:
0
];
4301
bank_w
=
REG_RC1
[
7
:
5
];
4302
end
4303
REG_RC2
[
2
:
0
]:
address_w
[
4
:
0
] =
REG_RC2
[
4
:
0
];
4304
REG_RC3
[
2
:
0
]:
address_w
[
4
:
0
] =
REG_RC3
[
4
:
0
];
4305
REG_RC4
[
2
:
0
]:
address_w
[
4
:
0
] =
REG_RC4
[
4
:
0
];
4306
REG_RC5
[
2
:
0
]:
address_w
[
4
:
0
] =
REG_RC5
[
4
:
0
];
4307
endcase
4308
end
else
if
(
init_state_r
==
INIT_LOAD_MR
)
begin
4309
// If loading mode register, look at cnt_init_mr to determine
4310
// which MR is currently being programmed
4311
address_w
=
'b0
;
4312
bank_w
=
'b0
;
4313
if
(
DRAM_TYPE
==
"DDR3"
)
begin
4314
if
(
rdlvl_stg1_done
&&
prbs_rdlvl_done
&&
pi_dqs_found_done
)
begin
4315
// end of the calibration programming correct
4316
// burst length
4317
if
(
TEST_AL
==
"0"
)
begin
4318
bank_w
[
1
:
0
] =
2'b00
;
4319
address_w
=
load_mr0
[
ROW_WIDTH
-
1
:
0
];
4320
address_w
[
8
]=
1'b0
;
//Don't reset DLL
4321
end
else
begin
4322
// programming correct AL value
4323
bank_w
[
1
:
0
] =
2'b01
;
4324
address_w
=
load_mr1
[
ROW_WIDTH
-
1
:
0
];
4325
if
(
TEST_AL
==
"CL-1"
)
4326
address_w
[
4
:
3
]=
2'b01
;
// AL="CL-1"
4327
else
4328
address_w
[
4
:
3
]=
2'b10
;
// AL="CL-2"
4329
end
4330
end
else
begin
4331
case
(
cnt_init_mr_r
)
4332
INIT_CNT_MR2
:
begin
4333
bank_w
[
1
:
0
] =
2'b10
;
4334
address_w
=
load_mr2
[
ROW_WIDTH
-
1
:
0
];
4335
address_w
[
10
:
9
] =
mr2_r
[
chip_cnt_r
];
4336
end
4337
INIT_CNT_MR3
:
begin
4338
bank_w
[
1
:
0
] =
2'b11
;
4339
address_w
=
load_mr3
[
ROW_WIDTH
-
1
:
0
];
4340
end
4341
INIT_CNT_MR1
:
begin
4342
bank_w
[
1
:
0
] =
2'b01
;
4343
address_w
=
load_mr1
[
ROW_WIDTH
-
1
:
0
];
4344
address_w
[
2
] =
mr1_r
[
chip_cnt_r
][
0
];
4345
address_w
[
6
] =
mr1_r
[
chip_cnt_r
][
1
];
4346
address_w
[
9
] =
mr1_r
[
chip_cnt_r
][
2
];
4347
end
4348
INIT_CNT_MR0
:
begin
4349
bank_w
[
1
:
0
] =
2'b00
;
4350
address_w
=
load_mr0
[
ROW_WIDTH
-
1
:
0
];
4351
// fixing it to BL8 for calibration
4352
address_w
[
1
:
0
] =
2'b00
;
4353
end
4354
default
:
begin
4355
bank_w
= {
BANK_WIDTH
{
1'bx
}};
4356
address_w
= {
ROW_WIDTH
{
1'bx
}};
4357
end
4358
endcase
4359
end
4360
end
else
begin
// DDR2
4361
case
(
cnt_init_mr_r
)
4362
INIT_CNT_MR2
:
begin
4363
if
(~
ddr2_refresh_flag_r
)
begin
4364
bank_w
[
1
:
0
] =
2'b10
;
4365
address_w
=
load_mr2
[
ROW_WIDTH
-
1
:
0
];
4366
end
else
begin
// second set of lm commands
4367
bank_w
[
1
:
0
] =
2'b00
;
4368
address_w
=
load_mr0
[
ROW_WIDTH
-
1
:
0
];
4369
address_w
[
8
]=
1'b0
;
4370
//MRS command without resetting DLL
4371
end
4372
end
4373
INIT_CNT_MR3
:
begin
4374
if
(~
ddr2_refresh_flag_r
)
begin
4375
bank_w
[
1
:
0
] =
2'b11
;
4376
address_w
=
load_mr3
[
ROW_WIDTH
-
1
:
0
];
4377
end
else
begin
// second set of lm commands
4378
bank_w
[
1
:
0
] =
2'b00
;
4379
address_w
=
load_mr0
[
ROW_WIDTH
-
1
:
0
];
4380
address_w
[
8
]=
1'b0
;
4381
//MRS command without resetting DLL. Repeted again
4382
// because there is an extra state.
4383
end
4384
end
4385
INIT_CNT_MR1
:
begin
4386
bank_w
[
1
:
0
] =
2'b01
;
4387
if
(~
ddr2_refresh_flag_r
)
begin
4388
address_w
=
load_mr1
[
ROW_WIDTH
-
1
:
0
];
4389
end
else
begin
// second set of lm commands
4390
address_w
=
load_mr1
[
ROW_WIDTH
-
1
:
0
];
4391
address_w
[
9
:
7
] =
3'b111
;
4392
//OCD default state
4393
end
4394
end
4395
INIT_CNT_MR0
:
begin
4396
if
(~
ddr2_refresh_flag_r
)
begin
4397
bank_w
[
1
:
0
] =
2'b00
;
4398
address_w
=
load_mr0
[
ROW_WIDTH
-
1
:
0
];
4399
end
else
begin
// second set of lm commands
4400
bank_w
[
1
:
0
] =
2'b01
;
4401
address_w
=
load_mr1
[
ROW_WIDTH
-
1
:
0
];
4402
if
((
chip_cnt_r
==
2'd1
) || (
chip_cnt_r
==
2'd3
))
begin
4403
// always disable odt for rank 1 and rank 3 as per SPEC
4404
address_w
[
2
] =
'b0
;
4405
address_w
[
6
] =
'b0
;
4406
end
4407
//OCD exit
4408
end
4409
end
4410
default
:
begin
4411
bank_w
= {
BANK_WIDTH
{
1'bx
}};
4412
address_w
= {
ROW_WIDTH
{
1'bx
}};
4413
end
4414
endcase
4415
end
4416
end
else
if
((
init_state_r
==
INIT_PI_PHASELOCK_READS
) ||
4417
(
init_state_r
==
INIT_RDLVL_STG1_WRITE
) ||
4418
(
init_state_r
==
INIT_RDLVL_STG1_READ
))
begin
4419
// Writing and reading PRBS pattern for read leveling stage 1
4420
// Need to support burst length 4 or 8. PRBS pattern will be
4421
// written to entire row and read back from the same row repeatedly
4422
bank_w
=
CALIB_BA_ADD
[
BANK_WIDTH
-
1
:
0
];
4423
address_w
[
ROW_WIDTH
-
1
:
COL_WIDTH
] = {
ROW_WIDTH
-
COL_WIDTH
{
1'b0
}};
4424
if
(((
stg1_wr_rd_cnt
==
NUM_STG1_WR_RD
) && ~
rdlvl_stg1_done
) || (
stg1_wr_rd_cnt
==
'd128
))
4425
address_w
[
COL_WIDTH
-
1
:
0
] = {
COL_WIDTH
{
1'b0
}};
4426
else
if
(
phy_data_full_r
|| (!
new_burst_r
))
4427
address_w
[
COL_WIDTH
-
1
:
0
] =
phy_address
[
COL_WIDTH
-
1
:
0
];
4428
else
if
((
stg1_wr_rd_cnt
>=
9'd0
) &&
new_burst_r
&& ~
phy_data_full_r
)
4429
address_w
[
COL_WIDTH
-
1
:
0
] =
phy_address
[
COL_WIDTH
-
1
:
0
] +
ADDR_INC
;
4430
end
else
if
((
init_state_r
==
INIT_OCLKDELAY_WRITE
) ||
4431
(
init_state_r
==
INIT_OCLKDELAY_READ
))
begin
4432
bank_w
=
CALIB_BA_ADD
[
BANK_WIDTH
-
1
:
0
];
4433
address_w
[
ROW_WIDTH
-
1
:
COL_WIDTH
] = {
ROW_WIDTH
-
COL_WIDTH
{
1'b0
}};
4434
if
(
oclk_wr_cnt
==
NUM_STG1_WR_RD
)
4435
address_w
[
COL_WIDTH
-
1
:
0
] = {
COL_WIDTH
{
1'b0
}};
4436
else
if
(
phy_data_full_r
|| (!
new_burst_r
))
4437
address_w
[
COL_WIDTH
-
1
:
0
] =
phy_address
[
COL_WIDTH
-
1
:
0
];
4438
else
if
((
oclk_wr_cnt
>=
4'd0
) &&
new_burst_r
&& ~
phy_data_full_r
)
4439
address_w
[
COL_WIDTH
-
1
:
0
] =
phy_address
[
COL_WIDTH
-
1
:
0
] +
ADDR_INC
;
4440
end
else
if
((
init_state_r
==
INIT_WRCAL_WRITE
) ||
4441
(
init_state_r
==
INIT_WRCAL_READ
))
begin
4442
bank_w
=
CALIB_BA_ADD
[
BANK_WIDTH
-
1
:
0
];
4443
address_w
[
ROW_WIDTH
-
1
:
COL_WIDTH
] = {
ROW_WIDTH
-
COL_WIDTH
{
1'b0
}};
4444
if
(
wrcal_wr_cnt
==
NUM_STG1_WR_RD
)
4445
address_w
[
COL_WIDTH
-
1
:
0
] = {
COL_WIDTH
{
1'b0
}};
4446
else
if
(
phy_data_full_r
|| (!
new_burst_r
))
4447
address_w
[
COL_WIDTH
-
1
:
0
] =
phy_address
[
COL_WIDTH
-
1
:
0
];
4448
else
if
((
wrcal_wr_cnt
>=
4'd0
) &&
new_burst_r
&& ~
phy_data_full_r
)
4449
address_w
[
COL_WIDTH
-
1
:
0
] =
phy_address
[
COL_WIDTH
-
1
:
0
] +
ADDR_INC
;
4450
end
else
if
((
init_state_r
==
INIT_WRCAL_MULT_READS
) ||
4451
(
init_state_r
==
INIT_RDLVL_STG2_READ
))
begin
4452
// when writing or reading back training pattern for read leveling stage2
4453
// need to support burst length of 4 or 8. This may mean issuing
4454
// multiple commands to cover the entire range of addresses accessed
4455
// during read leveling.
4456
// Hard coding A[12] to 1 so that it will always be burst length of 8
4457
// for DDR3. Does not have any effect on DDR2.
4458
bank_w
=
CALIB_BA_ADD
[
BANK_WIDTH
-
1
:
0
];
4459
address_w
[
ROW_WIDTH
-
1
:
COL_WIDTH
] = {
ROW_WIDTH
-
COL_WIDTH
{
1'b0
}};
4460
address_w
[
COL_WIDTH
-
1
:
0
] =
4461
{
CALIB_COL_ADD
[
COL_WIDTH
-
1
:
3
],
burst_addr_r
,
3'b000
};
4462
address_w
[
12
] =
1'b1
;
4463
end
else
if
((
init_state_r
==
INIT_RDLVL_ACT
) ||
4464
(
init_state_r
==
INIT_WRCAL_ACT
) ||
4465
(
init_state_r
==
INIT_OCLKDELAY_ACT
))
begin
4466
4467
bank_w
=
CALIB_BA_ADD
[
BANK_WIDTH
-
1
:
0
];
4468
address_w
=
CALIB_ROW_ADD
[
ROW_WIDTH
-
1
:
0
];
4469
end
else
begin
4470
bank_w
= {
BANK_WIDTH
{
1'bx
}};
4471
address_w
= {
ROW_WIDTH
{
1'bx
}};
4472
end
4473
end
4474
4475
// registring before sending out
4476
generate
4477
genvar
r
,
s
;
4478
if
((
DRAM_TYPE
!=
"DDR3"
) || (
CA_MIRROR
!=
"ON"
))
begin
:
gen_no_mirror
4479
for
(
r
=
0
;
r
<
nCK_PER_CLK
;
r
=
r
+
1
)
begin
:
div_clk_loop
4480
always
@(
posedge
clk
)
begin
4481
phy_address
[(
r
*
ROW_WIDTH
) +:
ROW_WIDTH
] <= #TCQ
address_w
;
4482
phy_bank
[(
r
*
BANK_WIDTH
) +:
BANK_WIDTH
] <= #TCQ
bank_w
;
4483
end
4484
end
4485
end
else
begin
:
gen_mirror
4486
// Control/addressing mirroring (optional for DDR3 dual rank DIMMs)
4487
// Mirror for the 2nd rank only. Logic needs to be enhanced to account
4488
// for multiple slots, currently only supports one slot, 2-rank config
4489
4490
for
(
r
=
0
;
r
<
nCK_PER_CLK
;
r
=
r
+
1
)
begin
:
gen_ba_div_clk_loop
4491
for
(
s
=
0
;
s
<
BANK_WIDTH
;
s
=
s
+
1
)
begin
:
gen_ba
4492
4493
always
@(
posedge
clk
)
4494
if
(
chip_cnt_r
==
2'b00
)
begin
4495
phy_bank
[(
r
*
BANK_WIDTH
) +
s
] <= #TCQ
bank_w
[
s
];
4496
end
else
begin
4497
phy_bank
[(
r
*
BANK_WIDTH
) +
s
] <= #TCQ
bank_w
[(
s
==
0
) ?
1
: ((
s
==
1
) ?
0
:
s
)];
4498
end
4499
4500
end
4501
end
4502
4503
for
(
r
=
0
;
r
<
nCK_PER_CLK
;
r
=
r
+
1
)
begin
:
gen_addr_div_clk_loop
4504
for
(
s
=
0
;
s
<
ROW_WIDTH
;
s
=
s
+
1
)
begin
:
gen_addr
4505
always
@(
posedge
clk
)
4506
if
(
chip_cnt_r
==
2'b00
)
begin
4507
phy_address
[(
r
*
ROW_WIDTH
) +
s
] <= #TCQ
address_w
[
s
];
4508
end
else
begin
4509
phy_address
[(
r
*
ROW_WIDTH
) +
s
] <= #TCQ
address_w
[
4510
(
s
==
3
) ?
4
:
4511
((
s
==
4
) ?
3
:
4512
((
s
==
5
) ?
6
:
4513
((
s
==
6
) ?
5
:
4514
((
s
==
7
) ?
8
:
4515
((
s
==
8
) ?
7
:
s
)))))];
4516
end
4517
end
4518
end
4519
4520
end
4521
endgenerate
4522
4523
endmodule
Generated on Wed Apr 18 2018 10:55:27 for AMC13 by
1.8.1