* Initial plan * Refactor cpuif classes to use Interface abstraction Co-authored-by: arnavsacheti <36746504+arnavsacheti@users.noreply.github.com> * Fix type annotation consistency in Interface.signal() Co-authored-by: arnavsacheti <36746504+arnavsacheti@users.noreply.github.com> * Add runtime validation and documentation for indexer types Co-authored-by: arnavsacheti <36746504+arnavsacheti@users.noreply.github.com> * Remove unused variable in SVInterface.signal() Co-authored-by: arnavsacheti <36746504+arnavsacheti@users.noreply.github.com> * Fix master port directions in APB3 and APB4 flat interfaces Co-authored-by: arnavsacheti <36746504+arnavsacheti@users.noreply.github.com> * Fix AXI4LiteCpuifFlat and apply code formatting Co-authored-by: arnavsacheti <36746504+arnavsacheti@users.noreply.github.com> * PSELx -> PSEL * cleanup marker warnings --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: arnavsacheti <36746504+arnavsacheti@users.noreply.github.com>
85 lines
3.6 KiB
Python
85 lines
3.6 KiB
Python
"""AXI4-Lite-specific interface implementations."""
|
|
|
|
from systemrdl.node import AddressableNode
|
|
|
|
from ..interface import FlatInterface, SVInterface
|
|
|
|
|
|
class AXI4LiteSVInterface(SVInterface):
|
|
"""AXI4-Lite SystemVerilog interface."""
|
|
|
|
def get_interface_type(self) -> str:
|
|
return "axi4lite_intf"
|
|
|
|
def get_slave_name(self) -> str:
|
|
return "s_axil"
|
|
|
|
def get_master_prefix(self) -> str:
|
|
return "m_axil_"
|
|
|
|
|
|
class AXI4LiteFlatInterface(FlatInterface):
|
|
"""AXI4-Lite flat signal interface."""
|
|
|
|
def get_slave_prefix(self) -> str:
|
|
return "s_axil_"
|
|
|
|
def get_master_prefix(self) -> str:
|
|
return "m_axil_"
|
|
|
|
def _get_slave_port_declarations(self, slave_prefix: str) -> list[str]:
|
|
return [
|
|
# Write address channel
|
|
f"input logic {slave_prefix}AWVALID",
|
|
f"output logic {slave_prefix}AWREADY",
|
|
f"input logic [{self.cpuif.addr_width - 1}:0] {slave_prefix}AWADDR",
|
|
f"input logic [2:0] {slave_prefix}AWPROT",
|
|
# Write data channel
|
|
f"input logic {slave_prefix}WVALID",
|
|
f"output logic {slave_prefix}WREADY",
|
|
f"input logic [{self.cpuif.data_width - 1}:0] {slave_prefix}WDATA",
|
|
f"input logic [{self.cpuif.data_width // 8 - 1}:0] {slave_prefix}WSTRB",
|
|
# Write response channel
|
|
f"output logic {slave_prefix}BVALID",
|
|
f"input logic {slave_prefix}BREADY",
|
|
f"output logic [1:0] {slave_prefix}BRESP",
|
|
# Read address channel
|
|
f"input logic {slave_prefix}ARVALID",
|
|
f"output logic {slave_prefix}ARREADY",
|
|
f"input logic [{self.cpuif.addr_width - 1}:0] {slave_prefix}ARADDR",
|
|
f"input logic [2:0] {slave_prefix}ARPROT",
|
|
# Read data channel
|
|
f"output logic {slave_prefix}RVALID",
|
|
f"input logic {slave_prefix}RREADY",
|
|
f"output logic [{self.cpuif.data_width - 1}:0] {slave_prefix}RDATA",
|
|
f"output logic [1:0] {slave_prefix}RRESP",
|
|
]
|
|
|
|
def _get_master_port_declarations(self, child: AddressableNode, master_prefix: str) -> list[str]:
|
|
return [
|
|
# Write address channel
|
|
f"output logic {self.signal('AWVALID', child)}",
|
|
f"input logic {self.signal('AWREADY', child)}",
|
|
f"output logic [{self.cpuif.addr_width - 1}:0] {self.signal('AWADDR', child)}",
|
|
f"output logic [2:0] {self.signal('AWPROT', child)}",
|
|
# Write data channel
|
|
f"output logic {self.signal('WVALID', child)}",
|
|
f"input logic {self.signal('WREADY', child)}",
|
|
f"output logic [{self.cpuif.data_width - 1}:0] {self.signal('WDATA', child)}",
|
|
f"output logic [{self.cpuif.data_width // 8 - 1}:0] {self.signal('WSTRB', child)}",
|
|
# Write response channel
|
|
f"input logic {self.signal('BVALID', child)}",
|
|
f"output logic {self.signal('BREADY', child)}",
|
|
f"input logic [1:0] {self.signal('BRESP', child)}",
|
|
# Read address channel
|
|
f"output logic {self.signal('ARVALID', child)}",
|
|
f"input logic {self.signal('ARREADY', child)}",
|
|
f"output logic [{self.cpuif.addr_width - 1}:0] {self.signal('ARADDR', child)}",
|
|
f"output logic [2:0] {self.signal('ARPROT', child)}",
|
|
# Read data channel
|
|
f"input logic {self.signal('RVALID', child)}",
|
|
f"output logic {self.signal('RREADY', child)}",
|
|
f"input logic [{self.cpuif.data_width - 1}:0] {self.signal('RDATA', child)}",
|
|
f"input logic [1:0] {self.signal('RRESP', child)}",
|
|
]
|