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
controller
mig_7series_v1_9_bank_common.v
1
//*****************************************************************************
2
// (c) Copyright 2008 - 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 : bank_common.v
55
// /___/ /\ Date Last Modified : $date$
56
// \ \ / \ Date Created : Tue Jun 30 2009
57
// \___\/\___\
58
//
59
//Device : 7-Series
60
//Design Name : DDR3 SDRAM
61
//Purpose :
62
//Reference :
63
//Revision History :
64
//*****************************************************************************
65
66
// Common block for the bank machines. Bank_common computes various
67
// items that cross all of the bank machines. These values are then
68
// fed back to all of the bank machines. Most of these values have
69
// to do with a row machine figuring out where it belongs in a queue.
70
71
`timescale
1
ps /
1
ps
72
73
module
mig_7series_v1_9_bank_common
#
74
(
75
parameter
TCQ
=
100
,
76
parameter
BM_CNT_WIDTH
=
2
,
77
parameter
LOW_IDLE_CNT
=
1
,
78
parameter
nBANK_MACHS
=
4
,
79
parameter
nCK_PER_CLK
=
2
,
80
parameter
nOP_WAIT
=
0
,
81
parameter
nRFC
=
44
,
82
parameter
nXSDLL
=
512
,
83
parameter
RANK_WIDTH
=
2
,
84
parameter
RANKS
=
4
,
85
parameter
CWL
=
5
,
86
parameter
tZQCS
=
64
87
)
88
(
/*AUTOARG**/
89
// Outputs
90
accept_internal_r
,
accept_ns
,
accept
,
periodic_rd_insert
,
91
periodic_rd_ack_r
,
accept_req
,
rb_hit_busy_cnt
,
idle
,
idle_cnt
,
order_cnt
,
92
adv_order_q
,
bank_mach_next
,
op_exit_grant
,
low_idle_cnt_r
,
was_wr
,
93
was_priority
,
maint_wip_r
,
maint_idle
,
insert_maint_r
,
94
// Inputs
95
clk
,
rst
,
idle_ns
,
init_calib_complete
,
periodic_rd_r
,
use_addr
,
96
rb_hit_busy_r
,
idle_r
,
ordered_r
,
ordered_issued
,
head_r
,
end_rtp
,
97
passing_open_bank
,
op_exit_req
,
start_pre_wait
,
cmd
,
hi_priority
,
maint_req_r
,
98
maint_zq_r
,
maint_sre_r
,
maint_srx_r
,
maint_hit
,
bm_end
,
99
slot_0_present
,
slot_1_present
100
);
101
102
function
integer
clogb2
(
input
integer
size
);
// ceiling logb2
103
begin
104
size
=
size
-
1
;
105
for
(
clogb2
=
1
;
size
>
1
;
clogb2
=
clogb2
+
1
)
106
size
=
size
>>
1
;
107
end
108
endfunction
// clogb2
109
110
localparam
ZERO
=
0
;
111
localparam
ONE
=
1
;
112
localparam
[
BM_CNT_WIDTH
-
1
:
0
]
BM_CNT_ZERO
=
ZERO
[
0
+:
BM_CNT_WIDTH
];
113
localparam
[
BM_CNT_WIDTH
-
1
:
0
]
BM_CNT_ONE
=
ONE
[
0
+:
BM_CNT_WIDTH
];
114
115
input
clk
;
116
input
rst
;
117
118
input
[
nBANK_MACHS
-
1
:
0
]
idle_ns
;
119
input
init_calib_complete
;
120
wire
accept_internal_ns
=
init_calib_complete
&& |
idle_ns
;
121
output
reg
accept_internal_r
;
122
always
@(
posedge
clk
)
accept_internal_r
<=
accept_internal_ns
;
123
wire
periodic_rd_ack_ns
;
124
wire
accept_ns_lcl
=
accept_internal_ns
&& ~
periodic_rd_ack_ns
;
125
output
wire
accept_ns
;
126
assign
accept_ns
=
accept_ns_lcl
;
127
reg
accept_r
;
128
always
@(
posedge
clk
)
accept_r
<= #TCQ
accept_ns_lcl
;
129
130
// Wire to user interface informing user that the request has been accepted.
131
output
wire
accept
;
132
assign
accept
=
accept_r
;
133
134
`ifdef
MC_SVA
135
property
none_idle
;
136
@(
posedge
clk) (init_calib_complete && ~|idle_r);
137
endproperty
138
139
all_bank_machines_busy
: cover property (none_idle);
140
`endif
141
142
// periodic_rd_insert tells everyone to mux in the periodic read.
143
input
periodic_rd_r;
144
reg
periodic_rd_ack_r_lcl
;
145
reg
periodic_rd_cntr_r
;
146
always
@(
posedge
clk
)
begin
147
if
(
rst
)
periodic_rd_cntr_r
<= #TCQ
1'b0
;
148
else
if
(
periodic_rd_r
&&
periodic_rd_ack_r_lcl
)
149
periodic_rd_cntr_r
<= #TCQ ~
periodic_rd_cntr_r
;
150
end
151
152
wire
internal_periodic_rd_ack_r_lcl
= (
periodic_rd_cntr_r
&&
periodic_rd_ack_r_lcl
);
153
154
// wire periodic_rd_insert_lcl = periodic_rd_r && ~periodic_rd_ack_r_lcl;
155
wire
periodic_rd_insert_lcl
=
periodic_rd_r
&& ~
internal_periodic_rd_ack_r_lcl
;
156
output
wire
periodic_rd_insert
;
157
assign
periodic_rd_insert
=
periodic_rd_insert_lcl
;
158
159
// periodic_rd_ack_r acknowledges that the read has been accepted
160
// into the queue.
161
assign
periodic_rd_ack_ns
=
periodic_rd_insert_lcl
&&
accept_internal_ns
;
162
always
@(
posedge
clk
)
periodic_rd_ack_r_lcl
<= #TCQ
periodic_rd_ack_ns
;
163
output
wire
periodic_rd_ack_r
;
164
assign
periodic_rd_ack_r
=
periodic_rd_ack_r_lcl
;
165
166
// accept_req tells all q entries that a request has been accepted.
167
input
use_addr
;
168
wire
accept_req_lcl
=
periodic_rd_ack_r_lcl
|| (
accept_r
&&
use_addr
);
169
output
wire
accept_req
;
170
assign
accept_req
=
accept_req_lcl
;
171
172
// Count how many non idle bank machines hit on the rank and bank.
173
input
[
nBANK_MACHS
-
1
:
0
]
rb_hit_busy_r
;
174
output
reg
[
BM_CNT_WIDTH
-
1
:
0
]
rb_hit_busy_cnt
;
175
integer
i
;
176
always
@(
/*AS**/
rb_hit_busy_r
)
begin
177
rb_hit_busy_cnt
=
BM_CNT_ZERO
;
178
for
(
i
=
0
;
i
<
nBANK_MACHS
;
i
=
i
+
1
)
179
if
(
rb_hit_busy_r
[
i
])
rb_hit_busy_cnt
=
rb_hit_busy_cnt
+
BM_CNT_ONE
;
180
end
181
182
// Count the number of idle bank machines.
183
input
[
nBANK_MACHS
-
1
:
0
]
idle_r
;
184
output
reg
[
BM_CNT_WIDTH
-
1
:
0
]
idle_cnt
;
185
always
@(
/*AS**/
idle_r
)
begin
186
idle_cnt
=
BM_CNT_ZERO
;
187
for
(
i
=
0
;
i
<
nBANK_MACHS
;
i
=
i
+
1
)
188
if
(
idle_r
[
i
])
idle_cnt
=
idle_cnt
+
BM_CNT_ONE
;
189
end
190
191
// Report an overall idle status
192
output
idle
;
193
assign
idle
=
init_calib_complete
&& &
idle_r
;
194
195
// Count the number of bank machines in the ordering queue.
196
input
[
nBANK_MACHS
-
1
:
0
]
ordered_r
;
197
output
reg
[
BM_CNT_WIDTH
-
1
:
0
]
order_cnt
;
198
always
@(
/*AS**/
ordered_r
)
begin
199
order_cnt
=
BM_CNT_ZERO
;
200
for
(
i
=
0
;
i
<
nBANK_MACHS
;
i
=
i
+
1
)
201
if
(
ordered_r
[
i
])
order_cnt
=
order_cnt
+
BM_CNT_ONE
;
202
end
203
204
input
[
nBANK_MACHS
-
1
:
0
]
ordered_issued
;
205
output
wire
adv_order_q
;
206
assign
adv_order_q
= |
ordered_issued
;
207
208
// Figure out which bank machine is going to accept the next request.
209
input
[
nBANK_MACHS
-
1
:
0
]
head_r
;
210
wire
[
nBANK_MACHS
-
1
:
0
]
next
=
idle_r
&
head_r
;
211
output
reg
[
BM_CNT_WIDTH
-
1
:
0
]
bank_mach_next
;
212
always
@(
/*AS**/
next
)
begin
213
bank_mach_next
=
BM_CNT_ZERO
;
214
for
(
i
=
0
;
i
<=
nBANK_MACHS
-
1
;
i
=
i
+
1
)
215
if
(
next
[
i
])
bank_mach_next
=
i
[
BM_CNT_WIDTH
-
1
:
0
];
216
end
217
218
input
[
nBANK_MACHS
-
1
:
0
]
end_rtp
;
219
input
[
nBANK_MACHS
-
1
:
0
]
passing_open_bank
;
220
input
[
nBANK_MACHS
-
1
:
0
]
op_exit_req
;
221
output
wire
[
nBANK_MACHS
-
1
:
0
]
op_exit_grant
;
222
output
reg
low_idle_cnt_r
=
1'b0
;
223
input
[
nBANK_MACHS
-
1
:
0
]
start_pre_wait
;
224
225
generate
226
// In support of open page mode, the following logic
227
// keeps track of how many "idle" bank machines there
228
// are. In this case, idle means a bank machine is on
229
// the idle list, or is in the process of precharging and
230
// will soon be idle.
231
if
(
nOP_WAIT
==
0
)
begin
:
op_mode_disabled
232
assign
op_exit_grant
= {
nBANK_MACHS
{
1'b0
}};
233
end
234
235
else
begin
:
op_mode_enabled
236
reg
[
BM_CNT_WIDTH
:
0
]
idle_cnt_r
;
237
reg
[
BM_CNT_WIDTH
:
0
]
idle_cnt_ns
;
238
always
@(
/*AS**/
accept_req_lcl
or
idle_cnt_r
or
passing_open_bank
239
or
rst
or
start_pre_wait
)
240
if
(
rst
)
idle_cnt_ns
=
nBANK_MACHS
;
241
else
begin
242
idle_cnt_ns
=
idle_cnt_r
-
accept_req_lcl
;
243
for
(
i
=
0
;
i
<=
nBANK_MACHS
-
1
;
i
=
i
+
1
)
begin
244
idle_cnt_ns
=
idle_cnt_ns
+
passing_open_bank
[
i
];
245
end
246
idle_cnt_ns
=
idle_cnt_ns
+ |
start_pre_wait
;
247
end
248
always
@(
posedge
clk
)
idle_cnt_r
<= #TCQ
idle_cnt_ns
;
249
wire
low_idle_cnt_ns
= (
idle_cnt_ns
<=
LOW_IDLE_CNT
[
0
+:
BM_CNT_WIDTH
]);
250
always
@(
posedge
clk
)
low_idle_cnt_r
<= #TCQ
low_idle_cnt_ns
;
251
252
// This arbiter determines which bank machine should transition
253
// from open page wait to precharge. Ideally, this process
254
// would take the oldest waiter, but don't have any reasonable
255
// way to implement that. Instead, just use simple round robin
256
// arb with the small enhancement that the most recent bank machine
257
// to enter open page wait is given lowest priority in the arbiter.
258
259
wire
upd_last_master
= |
end_rtp
;
// should be one bit set at most
260
mig_7series_v1_9_round_robin_arb
#
261
(.
WIDTH
(
nBANK_MACHS
))
262
op_arb0
263
(.
grant_ns
(
op_exit_grant
[
nBANK_MACHS
-
1
:
0
]),
264
.
grant_r
(),
265
.
upd_last_master
(
upd_last_master
),
266
.
current_master
(
end_rtp
[
nBANK_MACHS
-
1
:
0
]),
267
.
clk
(
clk
),
268
.
rst
(
rst
),
269
.
req
(
op_exit_req
[
nBANK_MACHS
-
1
:
0
]),
270
.
disable_grant
(
1'b0
));
271
272
end
273
endgenerate
274
275
// Register some command information. This information will be used
276
// by the bank machines to figure out if there is something behind it
277
// in the queue that require hi priority.
278
279
input
[
2
:
0
]
cmd
;
280
output
reg
was_wr
;
281
always
@(
posedge
clk
)
was_wr
<= #TCQ
282
cmd
[
0
] && ~(
periodic_rd_r
&& ~
periodic_rd_ack_r_lcl
);
283
284
input
hi_priority
;
285
output
reg
was_priority
;
286
always
@(
posedge
clk
)
begin
287
if
(
hi_priority
)
288
was_priority
<= #TCQ
1'b1
;
289
else
290
was_priority
<= #TCQ
1'b0
;
291
end
292
293
294
// DRAM maintenance (refresh and ZQ) and self-refresh controller
295
296
input
maint_req_r
;
297
reg
maint_wip_r_lcl
;
298
output
wire
maint_wip_r
;
299
assign
maint_wip_r
=
maint_wip_r_lcl
;
300
wire
maint_idle_lcl
;
301
output
wire
maint_idle
;
302
assign
maint_idle
=
maint_idle_lcl
;
303
input
maint_zq_r
;
304
input
maint_sre_r
;
305
input
maint_srx_r
;
306
input
[
nBANK_MACHS
-
1
:
0
]
maint_hit
;
307
input
[
nBANK_MACHS
-
1
:
0
]
bm_end
;
308
wire
start_maint
;
309
wire
maint_end
;
310
311
generate
begin
:
maint_controller
312
313
// Idle when not (maintenance work in progress (wip), OR maintenance
314
// starting tick).
315
assign
maint_idle_lcl
= ~(
maint_req_r
||
maint_wip_r_lcl
);
316
317
// Maintenance work in progress starts with maint_reg_r tick, terminated
318
// with maint_end tick. maint_end tick is generated by the RFC/ZQ/XSDLL timer
319
// below.
320
wire
maint_wip_ns
=
321
~
rst
&& ~
maint_end
&& (
maint_wip_r_lcl
||
maint_req_r
);
322
always
@(
posedge
clk
)
maint_wip_r_lcl
<= #TCQ
maint_wip_ns
;
323
324
// Keep track of which bank machines hit on the maintenance request
325
// when the request is made. As bank machines complete, an assertion
326
// of the bm_end signal clears the correspoding bit in the
327
// maint_hit_busies_r vector. Eventually, all bits should clear and
328
// the maintenance operation will proceed. ZQ and self-refresh hit on all
329
// non idle banks. Refresh hits only on non idle banks with the same rank as
330
// the refresh request.
331
wire
[
nBANK_MACHS
-
1
:
0
]
clear_vector
= {
nBANK_MACHS
{
rst
}} |
bm_end
;
332
wire
[
nBANK_MACHS
-
1
:
0
]
maint_zq_hits
= {
nBANK_MACHS
{
maint_idle_lcl
}} &
333
(
maint_hit
| {
nBANK_MACHS
{
maint_zq_r
}}) & ~
idle_ns
;
334
wire
[
nBANK_MACHS
-
1
:
0
]
maint_sre_hits
= {
nBANK_MACHS
{
maint_idle_lcl
}} &
335
(
maint_hit
| {
nBANK_MACHS
{
maint_sre_r
}}) & ~
idle_ns
;
336
reg
[
nBANK_MACHS
-
1
:
0
]
maint_hit_busies_r
;
337
wire
[
nBANK_MACHS
-
1
:
0
]
maint_hit_busies_ns
=
338
~
clear_vector
& (
maint_hit_busies_r
|
maint_zq_hits
|
maint_sre_hits
);
339
always
@(
posedge
clk
)
maint_hit_busies_r
<= #TCQ
maint_hit_busies_ns
;
340
341
// Queue is clear of requests conflicting with maintenance.
342
wire
maint_clear
= ~
maint_idle_lcl
&& ~|
maint_hit_busies_ns
;
343
344
// Ready to start sending maintenance commands.
345
wire
maint_rdy
=
maint_clear
;
346
reg
maint_rdy_r1
;
347
reg
maint_srx_r1
;
348
always
@(
posedge
clk
)
maint_rdy_r1
<= #TCQ
maint_rdy
;
349
always
@(
posedge
clk
)
maint_srx_r1
<= #TCQ
maint_srx_r
;
350
assign
start_maint
=
maint_rdy
&& ~
maint_rdy_r1
||
maint_srx_r
&& ~
maint_srx_r1
;
351
352
end
// block: maint_controller
353
endgenerate
354
355
356
// Figure out how many maintenance commands to send, and send them.
357
input
[
7
:
0
]
slot_0_present
;
358
input
[
7
:
0
]
slot_1_present
;
359
reg
insert_maint_r_lcl
;
360
output
wire
insert_maint_r
;
361
assign
insert_maint_r
=
insert_maint_r_lcl
;
362
363
generate
begin
:
generate_maint_cmds
364
365
// Count up how many slots are occupied. This tells
366
// us how many ZQ, SRE or SRX commands to send out.
367
reg
[
RANK_WIDTH
:
0
]
present_count
;
368
wire
[
7
:
0
]
present
=
slot_0_present
|
slot_1_present
;
369
always
@(
/*AS**/
present
)
begin
370
present_count
= {
RANK_WIDTH
{
1'b0
}};
371
for
(
i
=
0
;
i
<
8
;
i
=
i
+
1
)
372
present_count
=
present_count
+ {{
RANK_WIDTH
{
1'b0
}},
present
[
i
]};
373
end
374
375
// For refresh, there is only a single command sent. For
376
// ZQ, SRE and SRX, each rank present will receive a command. The counter
377
// below counts down the number of ranks present.
378
reg
[
RANK_WIDTH
:
0
]
send_cnt_ns
;
379
reg
[
RANK_WIDTH
:
0
]
send_cnt_r
;
380
always
@(
/*AS**/
maint_zq_r
or
maint_sre_r
or
maint_srx_r
or
present_count
381
or
rst
or
send_cnt_r
or
start_maint
)
382
if
(
rst
)
send_cnt_ns
=
4'b0
;
383
else
begin
384
send_cnt_ns
=
send_cnt_r
;
385
if
(
start_maint
&& (
maint_zq_r
||
maint_sre_r
||
maint_srx_r
))
send_cnt_ns
=
present_count
;
386
if
(|
send_cnt_ns
)
387
send_cnt_ns
=
send_cnt_ns
-
ONE
[
RANK_WIDTH
-
1
:
0
];
388
end
389
always
@(
posedge
clk
)
send_cnt_r
<= #TCQ
send_cnt_ns
;
390
391
// Insert a maintenance command for start_maint, or when the sent count
392
// is not zero.
393
wire
insert_maint_ns
=
start_maint
|| |
send_cnt_r
;
394
395
always
@(
posedge
clk
)
insert_maint_r_lcl
<= #TCQ
insert_maint_ns
;
396
end
// block: generate_maint_cmds
397
endgenerate
398
399
400
// RFC ZQ XSDLL timer. Generates delay from refresh, self-refresh exit or ZQ
401
// command until the end of the maintenance operation.
402
403
// Compute values for RFC, ZQ and XSDLL periods.
404
localparam
nRFC_CLKS
= (
nCK_PER_CLK
==
1
) ?
405
nRFC
:
406
(
nCK_PER_CLK
==
2
) ?
407
((
nRFC
/
2
) + (
nRFC
%
2
)) :
408
// (nCK_PER_CLK == 4)
409
((
nRFC
/
4
) + ((
nRFC
%
4
) ?
1
:
0
));
410
411
localparam
nZQCS_CLKS
= (
nCK_PER_CLK
==
1
) ?
412
tZQCS
:
413
(
nCK_PER_CLK
==
2
) ?
414
((
tZQCS
/
2
) + (
tZQCS
%
2
)) :
415
// (nCK_PER_CLK == 4)
416
((
tZQCS
/
4
) + ((
tZQCS
%
4
) ?
1
:
0
));
417
418
localparam
nXSDLL_CLKS
= (
nCK_PER_CLK
==
1
) ?
419
nXSDLL
:
420
(
nCK_PER_CLK
==
2
) ?
421
((
nXSDLL
/
2
) + (
nXSDLL
%
2
)) :
422
// (nCK_PER_CLK == 4)
423
((
nXSDLL
/
4
) + ((
nXSDLL
%
4
) ?
1
:
0
));
424
425
localparam
RFC_ZQ_TIMER_WIDTH
=
clogb2
(
nXSDLL_CLKS
+
1
);
426
427
localparam
THREE
=
3
;
428
429
generate
begin
:
rfc_zq_xsdll_timer
430
431
reg
[
RFC_ZQ_TIMER_WIDTH
-
1
:
0
]
rfc_zq_xsdll_timer_ns
;
432
reg
[
RFC_ZQ_TIMER_WIDTH
-
1
:
0
]
rfc_zq_xsdll_timer_r
;
433
434
always
@(
/*AS**/
insert_maint_r_lcl
or
maint_zq_r
or
maint_sre_r
or
maint_srx_r
435
or
rfc_zq_xsdll_timer_r
or
rst
)
begin
436
rfc_zq_xsdll_timer_ns
=
rfc_zq_xsdll_timer_r
;
437
if
(
rst
)
rfc_zq_xsdll_timer_ns
= {
RFC_ZQ_TIMER_WIDTH
{
1'b0
}};
438
else
if
(
insert_maint_r_lcl
)
rfc_zq_xsdll_timer_ns
=
maint_zq_r
?
439
nZQCS_CLKS
:
440
maint_sre_r
?
441
{
RFC_ZQ_TIMER_WIDTH
{
1'b0
}} :
442
maint_srx_r
?
443
nXSDLL_CLKS
:
444
nRFC_CLKS
;
445
else
if
(|
rfc_zq_xsdll_timer_r
)
rfc_zq_xsdll_timer_ns
=
446
rfc_zq_xsdll_timer_r
-
ONE
[
RFC_ZQ_TIMER_WIDTH
-
1
:
0
];
447
end
448
always
@(
posedge
clk
)
rfc_zq_xsdll_timer_r
<= #TCQ
rfc_zq_xsdll_timer_ns
;
449
450
// Based on rfc_zq_xsdll_timer_r, figure out when to release any bank
451
// machines waiting to send an activate. Need to add two to the end count.
452
// One because the counter starts a state after the insert_refresh_r, and
453
// one more because bm_end to insert_refresh_r is one state shorter
454
// than bm_end to rts_row.
455
assign
maint_end
= (
rfc_zq_xsdll_timer_r
==
THREE
[
RFC_ZQ_TIMER_WIDTH
-
1
:
0
]);
456
end
// block: rfc_zq_xsdll_timer
457
endgenerate
458
459
460
endmodule
// bank_common
Generated on Wed Apr 18 2018 10:55:27 for AMC13 by
1.8.1