Refactor cpuif classes to use Interface abstraction (#14)
* 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>
This commit is contained in:
84
src/peakrdl_busdecoder/cpuif/axi4lite/axi4lite_interface.py
Normal file
84
src/peakrdl_busdecoder/cpuif/axi4lite/axi4lite_interface.py
Normal file
@@ -0,0 +1,84 @@
|
||||
"""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)}",
|
||||
]
|
||||
Reference in New Issue
Block a user