lasmicon: add FIFO at bankmachine input to ease timing

This commit is contained in:
Sebastien Bourdeauducq 2013-06-17 23:33:57 +02:00
parent a04d53be07
commit e5737331ec
3 changed files with 27 additions and 12 deletions

View File

@ -20,7 +20,7 @@ class GeomSettings:
self.mux_a = max(row_a, col_a) self.mux_a = max(row_a, col_a)
class TimingSettings: class TimingSettings:
def __init__(self, tRP, tRCD, tWR, tWTR, tREFI, tRFC, CL, read_latency, write_latency, read_time, write_time): def __init__(self, tRP, tRCD, tWR, tWTR, tREFI, tRFC, read_latency, write_latency, req_queue_size, read_time, write_time):
self.tRP = tRP self.tRP = tRP
self.tRCD = tRCD self.tRCD = tRCD
self.tWR = tWR self.tWR = tWR
@ -28,10 +28,10 @@ class TimingSettings:
self.tREFI = tREFI self.tREFI = tREFI
self.tRFC = tRFC self.tRFC = tRFC
self.CL = CL
self.read_latency = read_latency self.read_latency = read_latency
self.write_latency = write_latency self.write_latency = write_latency
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
@ -48,6 +48,7 @@ class LASMIcon(Module):
aw=geom_settings.row_a + geom_settings.col_a - address_align, aw=geom_settings.row_a + geom_settings.col_a - address_align,
dw=phy_settings.dfi_d*phy_settings.nphases, dw=phy_settings.dfi_d*phy_settings.nphases,
nbanks=2**geom_settings.bank_a, nbanks=2**geom_settings.bank_a,
req_queue_size=timing_settings.req_queue_size,
read_latency=timing_settings.read_latency+1, read_latency=timing_settings.read_latency+1,
write_latency=timing_settings.write_latency+1) write_latency=timing_settings.write_latency+1)
self.nrowbits = geom_settings.col_a - address_align self.nrowbits = geom_settings.col_a - address_align

View File

@ -3,6 +3,7 @@ from migen.bus.asmibus import *
from migen.genlib.roundrobin import * from migen.genlib.roundrobin import *
from migen.genlib.fsm import FSM from migen.genlib.fsm import FSM
from migen.genlib.misc import optree from migen.genlib.misc import optree
from migen.genlib.fifo import SyncFIFO
from milkymist.lasmicon.multiplexer import * from milkymist.lasmicon.multiplexer import *
@ -33,19 +34,32 @@ class BankMachine(Module):
### ###
# Request FIFO
self.submodules.req_fifo = SyncFIFO([("we", 1), ("adr", flen(req.adr))], timing_settings.req_queue_size)
self.comb += [
self.req_fifo.din.we.eq(req.we),
self.req_fifo.din.adr.eq(req.adr),
self.req_fifo.we.eq(req.stb),
req.req_ack.eq(self.req_fifo.writable),
self.req_fifo.re.eq(req.dat_ack),
req.lock.eq(self.req_fifo.readable)
]
reqf = self.req_fifo.dout
slicer = _AddressSlicer(geom_settings.col_a, address_align) slicer = _AddressSlicer(geom_settings.col_a, address_align)
# Row tracking # Row tracking
has_openrow = Signal() has_openrow = Signal()
openrow = Signal(geom_settings.row_a) openrow = Signal(geom_settings.row_a)
hit = Signal() hit = Signal()
self.comb += hit.eq(openrow == slicer.row(req.adr)) self.comb += hit.eq(openrow == slicer.row(reqf.adr))
track_open = Signal() track_open = Signal()
track_close = Signal() track_close = Signal()
self.sync += [ self.sync += [
If(track_open, If(track_open,
has_openrow.eq(1), has_openrow.eq(1),
openrow.eq(slicer.row(req.adr)) openrow.eq(slicer.row(reqf.adr))
), ),
If(track_close, If(track_close,
has_openrow.eq(0) has_openrow.eq(0)
@ -57,9 +71,9 @@ class BankMachine(Module):
self.comb += [ self.comb += [
self.cmd.ba.eq(bankn), self.cmd.ba.eq(bankn),
If(s_row_adr, If(s_row_adr,
self.cmd.a.eq(slicer.row(req.adr)) self.cmd.a.eq(slicer.row(reqf.adr))
).Else( ).Else(
self.cmd.a.eq(slicer.col(req.adr)) self.cmd.a.eq(slicer.col(reqf.adr))
) )
] ]
@ -85,16 +99,16 @@ class BankMachine(Module):
fsm.act(fsm.REGULAR, fsm.act(fsm.REGULAR,
If(self.refresh_req, If(self.refresh_req,
fsm.next_state(fsm.REFRESH) fsm.next_state(fsm.REFRESH)
).Elif(req.stb, ).Elif(self.req_fifo.readable,
If(has_openrow, If(has_openrow,
If(hit, If(hit,
# NB: write-to-read specification is enforced by multiplexer # NB: write-to-read specification is enforced by multiplexer
self.cmd.stb.eq(1), self.cmd.stb.eq(1),
req.ack.eq(self.cmd.ack), req.dat_ack.eq(self.cmd.ack),
self.cmd.is_read.eq(~req.we), self.cmd.is_read.eq(~reqf.we),
self.cmd.is_write.eq(req.we), self.cmd.is_write.eq(reqf.we),
self.cmd.cas_n.eq(0), self.cmd.cas_n.eq(0),
self.cmd.we_n.eq(~req.we) self.cmd.we_n.eq(~reqf.we)
).Else( ).Else(
fsm.next_state(fsm.PRECHARGE) fsm.next_state(fsm.PRECHARGE)
) )

2
top.py
View File

@ -43,10 +43,10 @@ sdram_timing = lasmicon.TimingSettings(
tREFI=ns(7800, False), tREFI=ns(7800, False),
tRFC=ns(70), tRFC=ns(70),
CL=3,
read_latency=5, read_latency=5,
write_latency=0, write_latency=0,
req_queue_size=8,
read_time=32, read_time=32,
write_time=16 write_time=16
) )