Source code for hwtLib.cesnet.mi32.axi4Lite_to_mi32

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from hwt.code import If
from hwt.hdl.constants import READ
from hwt.interfaces.utils import addClkRstn
from hwt.synthesizer.param import Param
from hwtLib.abstract.busBridge import BusBridge
from hwtLib.amba.axi4Lite import Axi4Lite
from hwtLib.amba.constants import RESP_OKAY
from hwtLib.cesnet.mi32.intf import Mi32


[docs]class Axi4Lite_to_Mi32(BusBridge): """ Bridge from AxiLite interface to MI32 interface .. hwt-autodoc:: """ def _config(self) -> None: Mi32._config(self) self.RW_PRIORITY = Param(READ) def _declr(self) -> None: addClkRstn(self) with self._paramsShared(): self.s = Axi4Lite() self.m = Mi32()._m() def _impl(self) -> None: mi32 = self.m axi = self.s addr = self._reg("addr", axi.ar.addr._dtype) addr_vld = self._reg("addr_vld", def_val=0) addr_w = self._reg("addr_w", def_val=0) addr_ack = self._sig("addr_ack") r_data = self._reg("r_data", axi.r.data._dtype) r_data_vld = self._reg("r_data_vld", def_val=0) # this is required as we can not notify to MI32 slave that the axi master is not # able to receive data r_transaction_pending = self._reg("r_transaction_pending", def_val=0) w_transaction_pending = self._reg("w_transaction_pending", def_val=0) #backpressure = self._sig("backpressure") r_trans_ack = axi.r.ready & r_data_vld axi_w_ready_tmp = self._sig("axi_w_ready_tmp") w_trans_ack = addr_vld & addr_w & mi32.ardy & axi_w_ready_tmp no_transaction = ( ~r_transaction_pending | r_trans_ack ) & ( ~w_transaction_pending | w_trans_ack ) idle = no_transaction #& ~backpressure ready_for_addr = ~addr_vld | addr_ack if self.RW_PRIORITY == READ: If(idle & axi.ar.valid, addr(axi.ar.addr), addr_vld(1), addr_w(0), ).Elif(idle & axi.aw.valid, addr(axi.aw.addr), addr_vld(1), addr_w(1), ).Elif(addr_ack, addr(None), addr_vld(0), addr_w(None), ) axi.ar.ready(idle & ready_for_addr) axi.aw.ready(idle & (~axi.ar.valid & ready_for_addr)) If(r_trans_ack, r_transaction_pending(axi.ar.valid) ) If(w_trans_ack, w_transaction_pending(~axi.ar.valid & axi.aw.valid) ) else: If(idle & axi.aw.valid, addr(axi.aw.addr), addr_vld(1), addr_w(1), ).Elif(idle & axi.ar.valid, addr(axi.ar.addr), addr_vld(1), addr_w(0), ).Elif(addr_ack, addr(None), addr_vld(0), addr_w(None), ) axi.aw.ready(idle & ready_for_addr) axi.ar.ready(idle & ~axi.aw.valid & ready_for_addr) If(r_trans_ack, r_transaction_pending(~axi.aw.valid & axi.ar.valid) ) If(w_trans_ack, w_transaction_pending(axi.aw.valid) ) mi32.rd(idle & addr_vld & ~addr_w) mi32.wr(idle & addr_vld & addr_w & axi.w.valid) mi32.addr(addr) addr_ack(mi32.ardy) mi32.dwr(axi.w.data) mi32.be(axi.w.strb) axi_w_ready_tmp(addr_vld & addr_w & mi32.ardy) axi.w.ready(axi_w_ready_tmp) axi.b.resp(RESP_OKAY) axi.b.valid(addr_vld & addr_w & mi32.ardy & axi_w_ready_tmp) If(mi32.drdy, r_data(mi32.drd), r_data_vld(1), ).Elif(axi.r.ready, r_data(None), r_data_vld(0), ) axi.r.data(r_data) axi.r.resp(RESP_OKAY) axi.r.valid(r_data_vld)
#backpressure( # (r_data_vld & ~axi.r.ready) # | (addr_vld & addr_w & ~axi.b.ready) #) if __name__ == "__main__": from hwt.synthesizer.utils import to_rtl_str u = Axi4Lite_to_Mi32() print(to_rtl_str(u))