Source code for hwtLib.mem.lutRam
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from hwt.code import Concat, If
from hwt.hdl.types.bits import HBits
from hwt.hwIOs.std import HwIOSignal, HwIOClk
from hwt.serializer.mode import serializeExclude
from hwt.hwParam import HwParam
from hwt.hwModule import HwModule
from hwt.hdl.types.defs import BIT
[docs]
def mkLutRamCls(DATA_WIDTH):
"""
Lut ram generator,
hdl code will be excluded from serialization because we expect vendor library to contains it
"""
class RAMnX1S(HwModule):
def hwConfig(self):
self.INIT = HwParam(HBits(DATA_WIDTH).from_py(0))
self.IS_WCLK_INVERTED = HwParam(BIT.from_py(0))
def hwDeclr(self):
self.a0 = HwIOSignal()
self.a1 = HwIOSignal()
self.a2 = HwIOSignal()
self.a3 = HwIOSignal()
self.a4 = HwIOSignal()
self.a5 = HwIOSignal()
self.d = HwIOSignal() # in
self.wclk = HwIOClk()
self.o = HwIOSignal()._m() # out
self.we = HwIOSignal()
def hwImpl(self):
s = self._sig
wclk_in = s("wclk_in")
mem = self._sig("mem", HBits(DATA_WIDTH),
def_val=self.INIT)
a_in = s("a_in", HBits(6))
d_in = s("d_in")
we_in = s("we_in")
wclk_in(self.wclk ^ self.IS_WCLK_INVERTED)
we_in(self.we)
a_in(Concat(self.a5, self.a4, self.a3, self.a2, self.a1, self.a0))
d_in(self.d)
# ReadBehavior
self.o(mem[a_in])
# WriteBehavior
If(wclk_in._onRisingEdge() & we_in,
mem[a_in](d_in)
)
RAMnX1S.__name__ = f"RAM{DATA_WIDTH:d}X1S"
return RAMnX1S
# exclude from serialization because it is part of sources provided from FPGA vendor
RAM64X1S = serializeExclude(mkLutRamCls(64))
if __name__ == "__main__":
from hwt.synth import to_rtl_str
m = RAM64X1S()
# note that this will not produce any code as the serialization
# is disabled using serializeExclude
print(to_rtl_str(m))