Source code for hwtLib.cesnet.mi32.sliding_window
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from hwt.code import If
from hwt.interfaces.utils import addClkRstn
from hwt.math import isPow2
from hwt.synthesizer.param import Param
from hwtLib.abstract.busBridge import BusBridge
from hwtLib.cesnet.mi32.intf import Mi32
[docs]class Mi32SlidingWindow(BusBridge):
"""
Address space window + offset register which allows to address bigger
address space than available on input interface due size of its address signal
:note: address_space = HStruct(
(Bits(8)[WINDOW_SIZE], "window"),
(Bits(DATA_WIDTH), "offset"),
)
:note: offset is write only
:ivar ~.WINDOW_SIZE: size of window to "m" interface
also the address of offset register
.. hwt-autodoc::
"""
def _config(self):
Mi32._config(self)
self.M_ADDR_WIDTH = Param(self.ADDR_WIDTH + 1)
self.WINDOW_SIZE = Param(4096)
def _declr(self):
assert isPow2(self.WINDOW_SIZE), self.WINDOW_SIZE
assert self.M_ADDR_WIDTH > self.ADDR_WIDTH, (self.M_ADDR_WIDTH, self.ADDR_WIDTH)
assert (2 ** self.M_ADDR_WIDTH) >= self.WINDOW_SIZE, (
"has to be large enough in order to address whole window",
self.M_ADDR_WIDTH, self.WINDOW_SIZE
)
addClkRstn(self)
with self._paramsShared(exclude=({"ADDR_WIDTH"}, {})):
self.m = Mi32()._m()
self.m.ADDR_WIDTH = self.M_ADDR_WIDTH
self.s = Mi32()
self.s.ADDR_WIDTH = self.ADDR_WIDTH
def _impl(self):
OFFSET_REG_ADDR = self.WINDOW_SIZE
s, m = self.s, self.m
offset_en = s.addr._eq(OFFSET_REG_ADDR)
offset = self._reg("offset", m.addr._dtype, def_val=0)
m(s, exclude={m.addr, m.wr, m.ardy})
m.addr(offset + s.addr._reinterpret_cast(m.addr._dtype))
m.wr(s.wr & ~offset_en)
If(offset_en & s.wr,
offset(s.dwr, fit=True)
)
s.ardy(m.ardy | (s.wr & offset_en))
if __name__ == "__main__":
from hwt.synthesizer.utils import to_rtl_str
u = Mi32SlidingWindow()
u.ADDR_WIDTH = 16
u.M_ADDR_WIDTH = 32
print(to_rtl_str(u))