lasmicon: enable refresh at all times

This commit is contained in:
Sebastien Bourdeauducq 2015-09-24 16:01:08 +08:00
parent 9b08b037e4
commit ecdc4101b4
2 changed files with 53 additions and 56 deletions

View File

@ -12,8 +12,7 @@ class LASMIconSettings:
read_time=32, write_time=16, read_time=32, write_time=16,
l2_size=8192, l2_size=8192,
with_bandwidth=False, with_bandwidth=False,
with_memtest=False, with_memtest=False):
with_refresh=True):
self.req_queue_size = req_queue_size self.req_queue_size = req_queue_size
self.read_time = read_time self.read_time = read_time
self.write_time = write_time self.write_time = write_time
@ -23,7 +22,6 @@ class LASMIconSettings:
else: else:
self.with_bandwidth = with_bandwidth self.with_bandwidth = with_bandwidth
self.with_memtest = with_memtest self.with_memtest = with_memtest
self.with_refresh = with_refresh
class LASMIcon(Module): class LASMIcon(Module):
@ -50,7 +48,7 @@ class LASMIcon(Module):
### ###
self.submodules.refresher = Refresher(geom_settings.addressbits, geom_settings.bankbits, self.submodules.refresher = Refresher(geom_settings.addressbits, geom_settings.bankbits,
timing_settings.tRP, timing_settings.tREFI, timing_settings.tRFC, enabled=controller_settings.with_refresh) timing_settings.tRP, timing_settings.tREFI, timing_settings.tRFC)
self.submodules.bank_machines = [BankMachine(geom_settings, timing_settings, controller_settings, address_align, i, self.submodules.bank_machines = [BankMachine(geom_settings, timing_settings, controller_settings, address_align, i,
getattr(self.lasmic, "bank"+str(i))) getattr(self.lasmic, "bank"+str(i)))
for i in range(2**geom_settings.bankbits)] for i in range(2**geom_settings.bankbits)]

View File

@ -6,65 +6,64 @@ from misoc.mem.sdram.core.lasmicon.multiplexer import *
class Refresher(Module): class Refresher(Module):
def __init__(self, a, ba, tRP, tREFI, tRFC, enabled=True): def __init__(self, a, ba, tRP, tREFI, tRFC):
self.req = Signal() self.req = Signal()
self.ack = Signal() # 1st command 1 cycle after assertion of ack self.ack = Signal() # 1st command 1 cycle after assertion of ack
self.cmd = CommandRequest(a, ba) self.cmd = CommandRequest(a, ba)
### ###
if enabled: # Refresh sequence generator:
# Refresh sequence generator: # PRECHARGE ALL --(tRP)--> AUTO REFRESH --(tRFC)--> done
# PRECHARGE ALL --(tRP)--> AUTO REFRESH --(tRFC)--> done seq_start = Signal()
seq_start = Signal() seq_done = Signal()
seq_done = Signal() self.sync += [
self.sync += [ self.cmd.a.eq(2**10),
self.cmd.a.eq(2**10), self.cmd.ba.eq(0),
self.cmd.ba.eq(0), self.cmd.cas_n.eq(1),
self.cmd.cas_n.eq(1), self.cmd.ras_n.eq(1),
self.cmd.ras_n.eq(1), self.cmd.we_n.eq(1),
self.cmd.we_n.eq(1), seq_done.eq(0)
seq_done.eq(0) ]
] self.sync += timeline(seq_start, [
self.sync += timeline(seq_start, [ (1, [
(1, [ self.cmd.ras_n.eq(0),
self.cmd.ras_n.eq(0), self.cmd.we_n.eq(0)
self.cmd.we_n.eq(0) ]),
]), (1+tRP, [
(1+tRP, [ self.cmd.cas_n.eq(0),
self.cmd.cas_n.eq(0), self.cmd.ras_n.eq(0)
self.cmd.ras_n.eq(0) ]),
]), (1+tRP+tRFC, [
(1+tRP+tRFC, [ seq_done.eq(1)
seq_done.eq(1)
])
]) ])
])
# Periodic refresh counter # Periodic refresh counter
counter = Signal(max=tREFI) counter = Signal(max=tREFI)
start = Signal() start = Signal()
self.sync += [ self.sync += [
start.eq(0), start.eq(0),
If(counter == 0, If(counter == 0,
start.eq(1), start.eq(1),
counter.eq(tREFI - 1) counter.eq(tREFI - 1)
).Else( ).Else(
counter.eq(counter - 1) counter.eq(counter - 1)
) )
] ]
# Control FSM # Control FSM
fsm = FSM() fsm = FSM()
self.submodules += fsm self.submodules += fsm
fsm.act("IDLE", If(start, NextState("WAIT_GRANT"))) fsm.act("IDLE", If(start, NextState("WAIT_GRANT")))
fsm.act("WAIT_GRANT", fsm.act("WAIT_GRANT",
self.req.eq(1), self.req.eq(1),
If(self.ack, If(self.ack,
seq_start.eq(1), seq_start.eq(1),
NextState("WAIT_SEQ") NextState("WAIT_SEQ")
)
)
fsm.act("WAIT_SEQ",
self.req.eq(1),
If(seq_done, NextState("IDLE"))
) )
)
fsm.act("WAIT_SEQ",
self.req.eq(1),
If(seq_done, NextState("IDLE"))
)