2015-09-15 02:33:53 -04:00
|
|
|
from migen.fhdl.std import *
|
|
|
|
from migen.sim.generic import run_simulation
|
|
|
|
|
|
|
|
from litedram.common import *
|
2015-09-27 16:12:30 -04:00
|
|
|
from litedram.modules import MT48LC4M16
|
2015-09-15 02:33:53 -04:00
|
|
|
from litedram.core.bankmachine import LiteDRAMBankMachine
|
|
|
|
|
|
|
|
from test.common import *
|
|
|
|
|
2015-09-27 16:12:30 -04:00
|
|
|
class CmdGen(Module):
|
|
|
|
def __init__(self, dram_module):
|
|
|
|
self.rowbits = rowbits = dram_module.geom_settings.rowbits
|
|
|
|
self.colbits = colbits = dram_module.geom_settings.colbits
|
|
|
|
self.cmd = Source(dram_cmd_description(rowbits, colbits))
|
|
|
|
self.n = 0
|
|
|
|
|
|
|
|
def do_simulation(self, selfp):
|
|
|
|
if selfp.cmd.ack:
|
|
|
|
if self.n < 100:
|
|
|
|
selfp.cmd.stb = 1
|
|
|
|
selfp.cmd.row = randn(2**self.rowbits-1)
|
|
|
|
selfp.cmd.col = randn(2**self.colbits-1)
|
|
|
|
self.n += 1
|
|
|
|
else:
|
|
|
|
selfp.cmd.stb = 0
|
|
|
|
|
|
|
|
|
2015-09-15 02:33:53 -04:00
|
|
|
class TB(Module):
|
|
|
|
def __init__(self):
|
2015-09-27 16:12:30 -04:00
|
|
|
dram_module = MT48LC4M16(100*1000000)
|
|
|
|
self.submodules.bankmachine = LiteDRAMBankMachine(dram_module, 16)
|
|
|
|
self.submodules.write_gen = CmdGen(dram_module)
|
|
|
|
self.submodules.read_gen = CmdGen(dram_module)
|
|
|
|
self.comb += [
|
|
|
|
Record.connect(self.write_gen.cmd, self.bankmachine.write_cmd),
|
|
|
|
Record.connect(self.read_gen.cmd, self.bankmachine.read_cmd),
|
|
|
|
self.bankmachine.cmd.ack.eq(1)
|
|
|
|
]
|
|
|
|
|
|
|
|
self.nreads = 0
|
|
|
|
self.nwrites = 0
|
|
|
|
|
|
|
|
def do_simulation(self, selfp):
|
|
|
|
if selfp.bankmachine.cmd.stb:
|
|
|
|
if selfp.bankmachine.cmd.write:
|
|
|
|
self.nwrites += 1
|
|
|
|
print("nwrites {}/ nreads {}".format(self.nwrites, self.nreads))
|
|
|
|
elif selfp.bankmachine.cmd.read:
|
|
|
|
self.nreads += 1
|
|
|
|
print("nwrites {}/ nreads {}".format(self.nwrites, self.nreads))
|
|
|
|
|
2015-09-15 02:33:53 -04:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
run_simulation(TB(), ncycles=2048, vcd_name="my.vcd", keep_files=True)
|