Skip to content

Commit

Permalink
interconnect/wishbone: Add initial RegionsRemapper to allow remapping…
Browse files Browse the repository at this point in the history
… source regions to destination regions.
  • Loading branch information
enjoy-digital committed Feb 13, 2024
1 parent 19db80e commit 5ee746f
Showing 1 changed file with 26 additions and 2 deletions.
28 changes: 26 additions & 2 deletions litex/soc/interconnect/wishbone.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,16 +135,40 @@ def __init__(self, master, slave, origin, size):
addressing = master.addressing
assert master.addressing == slave.addressing

# Mask.
# Compute Mask.
log2_size = int(log2(size))
if addressing == "word":
log2_size -= int(log2(len(master.dat_w)//8))
mask = 2**log2_size - 1

# Address Mask and Shift.
# Connect Master to Slave.
self.comb += master.connect(slave, omit={"adr"})

# Connect Address with Mask and Shift.
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 ---------------------------------------------------------------------------------

class Timeout(LiteXModule):
Expand Down

0 comments on commit 5ee746f

Please sign in to comment.