Dev/downsize apb paddr (#27)
* Downsize paddr bits * Updated Test suite to use offset aligned address * fix for apb3 and axi4lite * modified structure to pass hierarchy information --------- Co-authored-by: Byron Lathi <bslathi19@gmail.com>
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
from collections import deque
|
||||
from typing import TYPE_CHECKING, overload
|
||||
|
||||
from systemrdl.node import AddressableNode
|
||||
@@ -32,7 +33,7 @@ class APB3Cpuif(BaseCpuif):
|
||||
def signal(self, signal: str, node: AddressableNode | None = None, indexer: str | None = None) -> str:
|
||||
return self._interface.signal(signal, node, indexer)
|
||||
|
||||
def fanout(self, node: AddressableNode) -> str:
|
||||
def fanout(self, node: AddressableNode, array_stack: deque[int]) -> str:
|
||||
fanout: dict[str, str] = {}
|
||||
fanout[self.signal("PSEL", node, "gi")] = (
|
||||
f"cpuif_wr_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}|cpuif_rd_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
from collections import deque
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from systemrdl.node import AddressableNode
|
||||
|
||||
from ...utils import get_indexed_path
|
||||
from ...sv_int import SVInt
|
||||
from ...utils import clog2, get_indexed_path
|
||||
from ..base_cpuif import BaseCpuif
|
||||
from .apb3_interface import APB3FlatInterface
|
||||
|
||||
@@ -33,8 +35,12 @@ class APB3CpuifFlat(BaseCpuif):
|
||||
) -> str:
|
||||
return self._interface.signal(signal, node, idx)
|
||||
|
||||
def fanout(self, node: AddressableNode) -> str:
|
||||
def fanout(self, node: AddressableNode, array_stack: deque[int]) -> str:
|
||||
fanout: dict[str, str] = {}
|
||||
addr_comp = [f"{self.signal('PADDR')}"]
|
||||
for i, stride in enumerate(array_stack):
|
||||
addr_comp.append(f"(gi{i}*{SVInt(stride, self.addr_width)})")
|
||||
|
||||
fanout[self.signal("PSEL", node, "gi")] = (
|
||||
f"cpuif_wr_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}|cpuif_rd_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
|
||||
)
|
||||
@@ -42,7 +48,7 @@ class APB3CpuifFlat(BaseCpuif):
|
||||
fanout[self.signal("PWRITE", node, "gi")] = (
|
||||
f"cpuif_wr_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
|
||||
)
|
||||
fanout[self.signal("PADDR", node, "gi")] = self.signal("PADDR")
|
||||
fanout[self.signal("PADDR", node, "gi")] = f"{{{'-'.join(addr_comp)}}}[{clog2(node.size) - 1}:0]"
|
||||
fanout[self.signal("PWDATA", node, "gi")] = "cpuif_wr_data"
|
||||
|
||||
return "\n".join(map(lambda kv: f"assign {kv[0]} = {kv[1]};", fanout.items()))
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
from systemrdl.node import AddressableNode
|
||||
|
||||
from ...utils import clog2
|
||||
from ..interface import FlatInterface, SVInterface
|
||||
|
||||
|
||||
@@ -48,7 +49,7 @@ class APB3FlatInterface(FlatInterface):
|
||||
f"output logic {self.signal('PSEL', child)}",
|
||||
f"output logic {self.signal('PENABLE', child)}",
|
||||
f"output logic {self.signal('PWRITE', child)}",
|
||||
f"output logic [{self.cpuif.addr_width - 1}:0] {self.signal('PADDR', child)}",
|
||||
f"output logic [{clog2(child.size) - 1}:0] {self.signal('PADDR', child)}",
|
||||
f"output logic [{self.cpuif.data_width - 1}:0] {self.signal('PWDATA', child)}",
|
||||
f"input logic [{self.cpuif.data_width - 1}:0] {self.signal('PRDATA', child)}",
|
||||
f"input logic {self.signal('PREADY', child)}",
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from collections import deque
|
||||
from typing import TYPE_CHECKING, overload
|
||||
|
||||
from systemrdl.node import AddressableNode
|
||||
@@ -33,7 +34,7 @@ class APB4Cpuif(BaseCpuif):
|
||||
def signal(self, signal: str, node: AddressableNode | None = None, indexer: str | None = None) -> str:
|
||||
return self._interface.signal(signal, node, indexer)
|
||||
|
||||
def fanout(self, node: AddressableNode) -> str:
|
||||
def fanout(self, node: AddressableNode, array_stack: deque[int]) -> str:
|
||||
fanout: dict[str, str] = {}
|
||||
fanout[self.signal("PSEL", node, "gi")] = (
|
||||
f"cpuif_wr_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}|cpuif_rd_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
from collections import deque
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from systemrdl.node import AddressableNode
|
||||
|
||||
from ...utils import get_indexed_path
|
||||
from ...sv_int import SVInt
|
||||
from ...utils import clog2, get_indexed_path
|
||||
from ..base_cpuif import BaseCpuif
|
||||
from .apb4_interface import APB4FlatInterface
|
||||
|
||||
@@ -33,8 +35,12 @@ class APB4CpuifFlat(BaseCpuif):
|
||||
) -> str:
|
||||
return self._interface.signal(signal, node, idx)
|
||||
|
||||
def fanout(self, node: AddressableNode) -> str:
|
||||
def fanout(self, node: AddressableNode, array_stack: deque[int]) -> str:
|
||||
fanout: dict[str, str] = {}
|
||||
addr_comp = [f"{self.signal('PADDR')}"]
|
||||
for i, stride in enumerate(array_stack):
|
||||
addr_comp.append(f"(gi{i}*{SVInt(stride, self.addr_width)})")
|
||||
|
||||
fanout[self.signal("PSEL", node, "gi")] = (
|
||||
f"cpuif_wr_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}|cpuif_rd_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
|
||||
)
|
||||
@@ -42,7 +48,7 @@ class APB4CpuifFlat(BaseCpuif):
|
||||
fanout[self.signal("PWRITE", node, "gi")] = (
|
||||
f"cpuif_wr_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
|
||||
)
|
||||
fanout[self.signal("PADDR", node, "gi")] = self.signal("PADDR")
|
||||
fanout[self.signal("PADDR", node, "gi")] = f"{{{'-'.join(addr_comp)}}}[{clog2(node.size) - 1}:0]"
|
||||
fanout[self.signal("PPROT", node, "gi")] = self.signal("PPROT")
|
||||
fanout[self.signal("PWDATA", node, "gi")] = "cpuif_wr_data"
|
||||
fanout[self.signal("PSTRB", node, "gi")] = "cpuif_wr_byte_en"
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
from systemrdl.node import AddressableNode
|
||||
|
||||
from ...utils import clog2
|
||||
from ..interface import FlatInterface, SVInterface
|
||||
|
||||
|
||||
@@ -50,7 +51,7 @@ class APB4FlatInterface(FlatInterface):
|
||||
f"output logic {self.signal('PSEL', child)}",
|
||||
f"output logic {self.signal('PENABLE', child)}",
|
||||
f"output logic {self.signal('PWRITE', child)}",
|
||||
f"output logic [{self.cpuif.addr_width - 1}:0] {self.signal('PADDR', child)}",
|
||||
f"output logic [{clog2(child.size) - 1}:0] {self.signal('PADDR', child)}",
|
||||
f"output logic [2:0] {self.signal('PPROT', child)}",
|
||||
f"output logic [{self.cpuif.data_width - 1}:0] {self.signal('PWDATA', child)}",
|
||||
f"output logic [{self.cpuif.data_width // 8 - 1}:0] {self.signal('PSTRB', child)}",
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from collections import deque
|
||||
from typing import TYPE_CHECKING, overload
|
||||
|
||||
from systemrdl.node import AddressableNode
|
||||
@@ -33,7 +34,7 @@ class AXI4LiteCpuif(BaseCpuif):
|
||||
def signal(self, signal: str, node: AddressableNode | None = None, indexer: str | None = None) -> str:
|
||||
return self._interface.signal(signal, node, indexer)
|
||||
|
||||
def fanout(self, node: AddressableNode) -> str:
|
||||
def fanout(self, node: AddressableNode, array_stack: deque[int]) -> str:
|
||||
fanout: dict[str, str] = {}
|
||||
|
||||
wr_sel = f"cpuif_wr_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
from collections import deque
|
||||
from typing import TYPE_CHECKING, overload
|
||||
|
||||
from systemrdl.node import AddressableNode
|
||||
|
||||
from ...utils import get_indexed_path
|
||||
from ...sv_int import SVInt
|
||||
from ...utils import clog2, get_indexed_path
|
||||
from ..base_cpuif import BaseCpuif
|
||||
from .axi4_lite_interface import AXI4LiteFlatInterface
|
||||
|
||||
@@ -35,15 +37,21 @@ class AXI4LiteCpuifFlat(BaseCpuif):
|
||||
def signal(self, signal: str, node: AddressableNode | None = None, indexer: str | None = None) -> str:
|
||||
return self._interface.signal(signal, node, indexer)
|
||||
|
||||
def fanout(self, node: AddressableNode) -> str:
|
||||
def fanout(self, node: AddressableNode, array_stack: deque[int]) -> str:
|
||||
fanout: dict[str, str] = {}
|
||||
waddr_comp = [f"{self.signal('AWADDR')}"]
|
||||
raddr_comp = [f"{self.signal('ARADDR')}"]
|
||||
for i, stride in enumerate(array_stack):
|
||||
offset = f"(gi{i}*{SVInt(stride, self.addr_width)})"
|
||||
waddr_comp.append(offset)
|
||||
raddr_comp.append(offset)
|
||||
|
||||
wr_sel = f"cpuif_wr_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
|
||||
rd_sel = f"cpuif_rd_sel.{get_indexed_path(self.exp.ds.top_node, node, 'gi')}"
|
||||
|
||||
# Write address channel
|
||||
fanout[self.signal("AWVALID", node, "gi")] = wr_sel
|
||||
fanout[self.signal("AWADDR", node, "gi")] = self.signal("AWADDR")
|
||||
fanout[self.signal("AWADDR", node, "gi")] = f"{{{'-'.join(waddr_comp)}}}[{clog2(node.size) - 1}:0]"
|
||||
fanout[self.signal("AWPROT", node, "gi")] = self.signal("AWPROT")
|
||||
|
||||
# Write data channel
|
||||
@@ -56,7 +64,7 @@ class AXI4LiteCpuifFlat(BaseCpuif):
|
||||
|
||||
# Read address channel
|
||||
fanout[self.signal("ARVALID", node, "gi")] = rd_sel
|
||||
fanout[self.signal("ARADDR", node, "gi")] = self.signal("ARADDR")
|
||||
fanout[self.signal("ARADDR", node, "gi")] = f"{{{'-'.join(raddr_comp)}}}[{clog2(node.size) - 1}:0]"
|
||||
fanout[self.signal("ARPROT", node, "gi")] = self.signal("ARPROT")
|
||||
|
||||
# Read data channel (master -> slave)
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
from systemrdl.node import AddressableNode
|
||||
|
||||
from ...utils import clog2
|
||||
from ..interface import FlatInterface, SVInterface
|
||||
|
||||
|
||||
@@ -60,7 +61,7 @@ class AXI4LiteFlatInterface(FlatInterface):
|
||||
# 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 [{clog2(child.size) - 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)}",
|
||||
@@ -74,7 +75,7 @@ class AXI4LiteFlatInterface(FlatInterface):
|
||||
# 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 [{clog2(child.size) - 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)}",
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import inspect
|
||||
import os
|
||||
from collections import deque
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
import jinja2 as jj
|
||||
@@ -106,7 +107,7 @@ class BaseCpuif:
|
||||
|
||||
return f"({cpuif_addr} - 'h{addr:x})[{clog2(size) - 1}:0]"
|
||||
|
||||
def fanout(self, node: AddressableNode) -> str:
|
||||
def fanout(self, node: AddressableNode, array_stack: deque[int]) -> str:
|
||||
raise NotImplementedError
|
||||
|
||||
def fanin(self, node: AddressableNode | None = None) -> str:
|
||||
|
||||
@@ -43,7 +43,7 @@ class FanoutGenerator(BusDecoderListener):
|
||||
)
|
||||
self._stack.append(fb)
|
||||
|
||||
self._stack[-1] += self._cpuif.fanout(node)
|
||||
self._stack[-1] += self._cpuif.fanout(node, self._array_stride_stack)
|
||||
|
||||
return action
|
||||
|
||||
|
||||
Reference in New Issue
Block a user