litedram/test/common.py

93 lines
2.9 KiB
Python
Raw Normal View History

import random
from migen import *
2016-05-23 07:30:38 -04:00
def rand_wait(level):
prng = random.Random(42)
while prng.randrange(100) < level:
yield
def seed_to_data(seed, random=True, nbits=32):
if nbits == 32:
if random:
return (seed * 0x31415979 + 1) & 0xffffffff
else:
return seed
else:
assert nbits%32 == 0
data = 0
for i in range(nbits//32):
data = data << 32
data |= seed_to_data(seed*nbits//32 + i, random, 32)
return data
2016-05-23 07:30:38 -04:00
class DRAMMemory:
def __init__(self, width, depth, init=[]):
self.width = width
self.depth = depth
self.mem = []
for d in init:
self.mem.append(d)
for _ in range(depth-len(init)):
self.mem.append(0)
2018-08-28 07:39:11 -04:00
def show_content(self):
for addr in range(self.depth):
print("0x{:08x}: 0x{:08x}".format(addr, self.mem[addr]))
2016-05-23 07:30:38 -04:00
@passive
def read_handler(self, dram_port, rdata_valid_rand_level):
2016-05-23 07:30:38 -04:00
address = 0
pending = 0
prng = random.Random(42)
yield dram_port.cmd.ready.eq(0)
2016-05-23 07:30:38 -04:00
while True:
yield dram_port.rdata.valid.eq(0)
if pending:
yield from rand_wait(rdata_valid_rand_level)
2016-05-23 07:30:38 -04:00
yield dram_port.rdata.valid.eq(1)
yield dram_port.rdata.data.eq(self.mem[address%self.depth])
yield
yield dram_port.rdata.valid.eq(0)
yield dram_port.rdata.data.eq(0)
pending = 0
elif (yield dram_port.cmd.valid):
pending = not (yield dram_port.cmd.we)
2018-09-06 05:10:20 -04:00
address = (yield dram_port.cmd.addr)
if pending:
yield dram_port.cmd.ready.eq(1)
yield
yield dram_port.cmd.ready.eq(0)
2016-05-23 07:30:38 -04:00
yield
@passive
def write_handler(self, dram_port, wdata_ready_rand_level=0):
2016-05-23 07:30:38 -04:00
address = 0
pending = 0
prng = random.Random(42)
yield dram_port.cmd.ready.eq(0)
2016-05-23 07:30:38 -04:00
while True:
yield dram_port.wdata.ready.eq(0)
if pending:
2018-08-28 07:39:11 -04:00
while (yield dram_port.wdata.valid) == 0:
yield
yield from rand_wait(wdata_ready_rand_level)
2016-05-23 07:30:38 -04:00
yield dram_port.wdata.ready.eq(1)
yield
self.mem[address%self.depth] = (yield dram_port.wdata.data) # TODO manage we
yield dram_port.wdata.ready.eq(0)
yield
pending = 0
yield
2016-05-23 07:30:38 -04:00
elif (yield dram_port.cmd.valid):
pending = (yield dram_port.cmd.we)
2018-09-06 05:10:20 -04:00
address = (yield dram_port.cmd.addr)
if pending:
yield dram_port.cmd.ready.eq(1)
yield
yield dram_port.cmd.ready.eq(0)
2016-05-23 07:30:38 -04:00
yield