litedram/test/bankmachine_tb.py

56 lines
1.8 KiB
Python

from migen.fhdl.std import *
from migen.sim.generic import run_simulation
from litedram.common import *
from litedram.modules import MT48LC4M16
from litedram.core.bankmachine import LiteDRAMBankMachine
from test.common import *
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
class TB(Module):
def __init__(self):
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))
if __name__ == "__main__":
run_simulation(TB(), ncycles=2048, vcd_name="my.vcd", keep_files=True)