interconnect/wishbone: Add initial RegionsRemapper to allow remapping source regions to destination regions.
This commit is contained in:
parent
19db80ec9b
commit
5ee746f178
|
@ -135,16 +135,40 @@ class Remapper(LiteXModule):
|
||||||
addressing = master.addressing
|
addressing = master.addressing
|
||||||
assert master.addressing == slave.addressing
|
assert master.addressing == slave.addressing
|
||||||
|
|
||||||
# Mask.
|
# Compute Mask.
|
||||||
log2_size = int(log2(size))
|
log2_size = int(log2(size))
|
||||||
if addressing == "word":
|
if addressing == "word":
|
||||||
log2_size -= int(log2(len(master.dat_w)//8))
|
log2_size -= int(log2(len(master.dat_w)//8))
|
||||||
mask = 2**log2_size - 1
|
mask = 2**log2_size - 1
|
||||||
|
|
||||||
# Address Mask and Shift.
|
# Connect Master to Slave.
|
||||||
self.comb += master.connect(slave, omit={"adr"})
|
self.comb += master.connect(slave, omit={"adr"})
|
||||||
|
|
||||||
|
# Connect Address with Mask and Shift.
|
||||||
self.comb += slave.adr.eq(origin | (master.adr & mask))
|
self.comb += slave.adr.eq(origin | (master.adr & mask))
|
||||||
|
|
||||||
|
class RegionsRemapper(LiteXModule):
|
||||||
|
"""Remaps Wishbone addresses from specified source regions to destination regions"""
|
||||||
|
def __init__(self, master, slave, src_regions, dst_regions):
|
||||||
|
assert len(src_regions) == len(dst_regions)
|
||||||
|
assert master.addressing == slave.addressing
|
||||||
|
|
||||||
|
# Parameters.
|
||||||
|
adr_shift = {
|
||||||
|
"byte" : 0,
|
||||||
|
"word" : int(log2(len(master.dat_w)//8)),
|
||||||
|
}[master.addressing]
|
||||||
|
|
||||||
|
# Connect Master to Slave.
|
||||||
|
self.comb += master.connect(slave, omit={"adr"})
|
||||||
|
|
||||||
|
# Remap Regions.
|
||||||
|
for src_region, dst_region in zip(src_regions, dst_regions):
|
||||||
|
src_adr = master.adr << adr_shift
|
||||||
|
dst_adr = dst_region.origin + src_adr - src_region.origin
|
||||||
|
active = (src_adr >= src_region.origin) & (src_adr < (src_region.origin + src_region.size))
|
||||||
|
self.comb += If(active, slave.adr.eq(dst_adr >> adr_shift))
|
||||||
|
|
||||||
# Wishbone Timeout ---------------------------------------------------------------------------------
|
# Wishbone Timeout ---------------------------------------------------------------------------------
|
||||||
|
|
||||||
class Timeout(LiteXModule):
|
class Timeout(LiteXModule):
|
||||||
|
|
Loading…
Reference in New Issue