Skip to content

Commit 6073f68

Browse files
author
Sebastien Bourdeauducq
committedJul 13, 2012
asmicon: simple selector option
1 parent 768a3a8 commit 6073f68

File tree

3 files changed

+46
-21
lines changed

3 files changed

+46
-21
lines changed
 

‎milkymist/asmicon/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def __init__(self, bank_a, row_a, col_a):
2020
self.mux_a = max(row_a, col_a)
2121

2222
class TimingSettings:
23-
def __init__(self, tRP, tRCD, tWR, tREFI, tRFC, CL, rd_delay, slot_time, read_time, write_time):
23+
def __init__(self, tRP, tRCD, tWR, tREFI, tRFC, CL, rd_delay, read_time, write_time, slot_time=0):
2424
self.tRP = tRP
2525
self.tRCD = tRCD
2626
self.tWR = tWR
@@ -30,9 +30,9 @@ def __init__(self, tRP, tRCD, tWR, tREFI, tRFC, CL, rd_delay, slot_time, read_ti
3030
self.CL = CL
3131
self.rd_delay = rd_delay
3232

33-
self.slot_time = slot_time
3433
self.read_time = read_time
3534
self.write_time = write_time
35+
self.slot_time = slot_time
3636

3737
class ASMIcon:
3838
def __init__(self, phy_settings, geom_settings, timing_settings):

‎milkymist/asmicon/bankmachine.py

+44-18
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,46 @@ def __init__(self, slicer, bankn, slots):
4646
self.adr = Signal(self.slots[0].adr.bv)
4747
self.we = Signal()
4848

49+
# derived classes should drive rr.request
50+
self.rr = RoundRobin(self.nslots, SP_CE)
51+
52+
def get_fragment(self):
53+
comb = []
54+
rr = self.rr
55+
56+
# Multiplex
57+
state = Signal(BV(2))
58+
comb += [
59+
state.eq(Array(slot.state for slot in self.slots)[rr.grant]),
60+
self.adr.eq(Array(slot.adr for slot in self.slots)[rr.grant]),
61+
self.we.eq(Array(slot.we for slot in self.slots)[rr.grant]),
62+
self.stb.eq(
63+
(self.slicer.bank(self.adr) == self.bankn) \
64+
& (state == SLOT_PENDING)),
65+
rr.ce.eq(self.ack),
66+
self.tag.eq(rr.grant)
67+
]
68+
comb += [If((rr.grant == i) & self.stb & self.ack, slot.process.eq(1))
69+
for i, slot in enumerate(self.slots)]
70+
71+
return Fragment(comb) + rr.get_fragment()
72+
73+
class _SimpleSelector(_Selector):
74+
def get_fragment(self):
75+
comb = []
76+
for i, slot in enumerate(self.slots):
77+
comb.append(self.rr.request[i].eq(
78+
(self.slicer.bank(slot.adr) == self.bankn) & \
79+
(slot.state == SLOT_PENDING)
80+
))
81+
82+
return Fragment(comb) + super().get_fragment()
83+
84+
class _FullSelector(_Selector):
4985
def get_fragment(self):
5086
comb = []
5187
sync = []
88+
rr = self.rr
5289

5390
# List outstanding requests for our bank
5491
outstandings = []
@@ -112,22 +149,7 @@ def get_fragment(self):
112149
select_stmt = If(has_mature, *best_mature).Else(select_stmt)
113150
comb.append(select_stmt)
114151

115-
# Multiplex
116-
state = Signal(BV(2))
117-
comb += [
118-
state.eq(Array(slot.state for slot in self.slots)[rr.grant]),
119-
self.adr.eq(Array(slot.adr for slot in self.slots)[rr.grant]),
120-
self.we.eq(Array(slot.we for slot in self.slots)[rr.grant]),
121-
self.stb.eq(
122-
(self.slicer.bank(self.adr) == self.bankn) \
123-
& (state == SLOT_PENDING)),
124-
rr.ce.eq(self.ack),
125-
self.tag.eq(rr.grant)
126-
]
127-
comb += [If((rr.grant == i) & self.stb & self.ack, slot.process.eq(1))
128-
for i, slot in enumerate(self.slots)]
129-
130-
return Fragment(comb, sync) + rr.get_fragment()
152+
return Fragment(comb, sync) + super().get_fragment()
131153

132154
class _Buffer:
133155
def __init__(self, source):
@@ -156,12 +178,13 @@ def get_fragment(self):
156178
return Fragment(comb, sync)
157179

158180
class BankMachine:
159-
def __init__(self, geom_settings, timing_settings, address_align, bankn, slots):
181+
def __init__(self, geom_settings, timing_settings, address_align, bankn, slots, full_selector=False):
160182
self.geom_settings = geom_settings
161183
self.timing_settings = timing_settings
162184
self.address_align = address_align
163185
self.bankn = bankn
164186
self.slots = slots
187+
self.full_selector = full_selector
165188

166189
self.refresh_req = Signal()
167190
self.refresh_gnt = Signal()
@@ -174,7 +197,10 @@ def get_fragment(self):
174197

175198
# Sub components
176199
slicer = _AddressSlicer(self.geom_settings, self.address_align)
177-
selector = _Selector(slicer, self.bankn, self.slots)
200+
if self.full_selector:
201+
selector = _FullSelector(slicer, self.bankn, self.slots)
202+
else:
203+
selector = _SimpleSelector(slicer, self.bankn, self.slots)
178204
buf = _Buffer(selector)
179205

180206
# Row tracking

‎top.py

-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ def ns(t, margin=True):
4242
CL=3,
4343
rd_delay=4,
4444

45-
slot_time=16,
4645
read_time=32,
4746
write_time=16
4847
)

0 commit comments

Comments
 (0)
Please sign in to comment.