mirror of
https://github.com/enjoy-digital/litex.git
synced 2025-01-04 09:52:26 -05:00
tb/asmicon/bankmachine: selector test bench
This commit is contained in:
parent
ac7d89a4fe
commit
c129c98e10
2 changed files with 102 additions and 0 deletions
tb/asmicon
|
@ -39,3 +39,28 @@ class CommandLogger:
|
|||
|
||||
def get_fragment(self):
|
||||
return Fragment(sim=[self.do_simulation])
|
||||
|
||||
class SlotsLogger:
|
||||
def __init__(self, slicer, slots):
|
||||
self.slicer = slicer
|
||||
self.slots = slots
|
||||
|
||||
def do_simulation(self, sim):
|
||||
state_strs = ["EMPTY", "PEND", "PRCESS"]
|
||||
rw_strs = ["RD", "WR"]
|
||||
print("\t" + "\t".join([str(x) for x in range(len(self.slots))]))
|
||||
print("State:\t" + "\t".join([state_strs[sim.rd(s.state)] for s in self.slots]))
|
||||
print("RW:\t" + "\t".join([rw_strs[sim.rd(s.we)] for s in self.slots]))
|
||||
print("Row:\t" + "\t".join([str(self.slicer.row(sim.rd(s.adr))) for s in self.slots]))
|
||||
print("Bank:\t" + "\t".join([str(self.slicer.bank(sim.rd(s.adr))) for s in self.slots]))
|
||||
print("Col:\t" + "\t".join([str(self.slicer.col(sim.rd(s.adr))) for s in self.slots]))
|
||||
times = []
|
||||
for s in self.slots:
|
||||
if s.time:
|
||||
times.append(str(sim.rd(s._counter)) + "/" + str(s.time))
|
||||
else:
|
||||
times.append("N/A")
|
||||
print("Time:\t" + "\t".join(times))
|
||||
|
||||
def get_fragment(self):
|
||||
return Fragment(sim=[self.do_simulation])
|
||||
|
|
77
tb/asmicon/selector.py
Normal file
77
tb/asmicon/selector.py
Normal file
|
@ -0,0 +1,77 @@
|
|||
from migen.fhdl.structure import *
|
||||
from migen.bus.asmibus import *
|
||||
from migen.sim.generic import Simulator, TopLevel
|
||||
from migen.sim.icarus import Runner
|
||||
|
||||
from milkymist import asmicon
|
||||
from milkymist.asmicon.bankmachine import _AddressSlicer, _Selector, _Buffer
|
||||
|
||||
from common import SlotsLogger
|
||||
|
||||
sdram_geom = asmicon.GeomSettings(
|
||||
bank_a=2,
|
||||
row_a=13,
|
||||
col_a=10
|
||||
)
|
||||
|
||||
def my_generator(dt, offset):
|
||||
for t in range(dt):
|
||||
yield None
|
||||
for x in range(10):
|
||||
t = TRead(x + offset)
|
||||
yield t
|
||||
|
||||
class Selector:
|
||||
def __init__(self, slicer, bankn, slots):
|
||||
self.selector = _Selector(slicer, bankn, slots)
|
||||
self.queue = []
|
||||
|
||||
def do_simulation(self, s):
|
||||
if s.rd(self.selector.stb):
|
||||
tag = s.rd(self.selector.tag)
|
||||
self.queue.append(tag)
|
||||
print("==> SELECTED: " + str(tag))
|
||||
print("")
|
||||
|
||||
def get_fragment(self):
|
||||
comb = [self.selector.ack.eq(1)]
|
||||
return self.selector.get_fragment() + Fragment(comb, sim=[self.do_simulation])
|
||||
|
||||
class Completer:
|
||||
def __init__(self, hub, queue):
|
||||
self.hub = hub
|
||||
self.queue = queue
|
||||
|
||||
def do_simulation(self, s):
|
||||
if self.queue:
|
||||
tag = self.queue.pop()
|
||||
s.wr(self.hub.call, 1)
|
||||
s.wr(self.hub.tag_call, tag)
|
||||
else:
|
||||
s.wr(self.hub.call, 0)
|
||||
|
||||
def get_fragment(self):
|
||||
return Fragment(sim=[self.do_simulation])
|
||||
|
||||
def main():
|
||||
hub = Hub(12, 128, 8)
|
||||
initiators = [Initiator(hub.get_port(), my_generator(0, 2200*(i//6)+i*10))
|
||||
for i in range(8)]
|
||||
hub.finalize()
|
||||
|
||||
slots = hub.get_slots()
|
||||
slicer = _AddressSlicer(sdram_geom, 2)
|
||||
logger = SlotsLogger(slicer, slots)
|
||||
selector = Selector(slicer, 0, slots)
|
||||
completer = Completer(hub, selector.queue)
|
||||
|
||||
def end_simulation(s):
|
||||
s.interrupt = all([i.done for i in initiators])
|
||||
|
||||
fragment = hub.get_fragment() + sum([i.get_fragment() for i in initiators], Fragment()) + \
|
||||
logger.get_fragment() + selector.get_fragment() + completer.get_fragment() + \
|
||||
Fragment(sim=[end_simulation])
|
||||
sim = Simulator(fragment, Runner(), TopLevel("my.vcd"))
|
||||
sim.run()
|
||||
|
||||
main()
|
Loading…
Reference in a new issue