80 lines
2.0 KiB
Python
80 lines
2.0 KiB
Python
from random import Random
|
|
|
|
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.asmicon.bankmachine import _AddressSlicer, _Selector, _Buffer
|
|
|
|
from common import SlotsLogger, sdram_geom
|
|
|
|
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.buf = _Buffer(self.selector)
|
|
self.queue = []
|
|
self.prng = Random(876)
|
|
|
|
def do_simulation(self, s):
|
|
if self.prng.randrange(0, 5):
|
|
s.wr(self.buf.ack, 1)
|
|
else:
|
|
s.wr(self.buf.ack, 0)
|
|
if s.rd(self.buf.stb) and s.rd(self.buf.ack):
|
|
tag = s.rd(self.buf.tag)
|
|
self.queue.append(tag)
|
|
print("==> SELECTED: " + str(tag))
|
|
print("")
|
|
|
|
def get_fragment(self):
|
|
return self.selector.get_fragment() + \
|
|
self.buf.get_fragment() + \
|
|
Fragment(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()
|