bug fixes for address rewriter
This commit is contained in:
@@ -8,21 +8,25 @@ import freechips.rocketchip.tilelink.TLAdapterNode
|
|||||||
import org.chipsalliance.cde.config.Parameters
|
import org.chipsalliance.cde.config.Parameters
|
||||||
|
|
||||||
|
|
||||||
class AddressRewriterNode(baseAddr: BigInt)(implicit p: Parameters) extends LazyModule {
|
class AddressRewriterNode(rewriteFn: UInt => UInt)(implicit p: Parameters) extends LazyModule {
|
||||||
require(isPow2(baseAddr) || (baseAddr == 0), "base address must be a power of 2")
|
|
||||||
|
|
||||||
val node = TLAdapterNode(clientFn = c => c, managerFn = m => m)
|
val node = TLAdapterNode(clientFn = c => c, managerFn = m => m)
|
||||||
lazy val module = new LazyModuleImp(this) {
|
lazy val module = new LazyModuleImp(this) {
|
||||||
(node.in.map(_._1) zip node.out.map(_._1)).foreach { case (i, o) =>
|
(node.in.map(_._1) zip node.out.map(_._1)).foreach { case (i, o) =>
|
||||||
o.a <> i.a
|
o.a <> i.a
|
||||||
o.a.bits.address := i.a.bits.address | baseAddr.U
|
o.a.bits.address := rewriteFn(i.a.bits.address)
|
||||||
i.d <> o.d
|
i.d <> o.d
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object AddressRewriterNode {
|
object AddressOrNode {
|
||||||
def apply(baseAddr: BigInt)(implicit p: Parameters, valName: ValName, sourceInfo: SourceInfo): TLAdapterNode = {
|
def apply(baseAddr: BigInt)(implicit p: Parameters, valName: ValName, sourceInfo: SourceInfo): TLAdapterNode = {
|
||||||
LazyModule(new AddressRewriterNode(baseAddr)).node
|
LazyModule(new AddressRewriterNode(x => x | baseAddr.U)).node
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object AddressAndNode {
|
||||||
|
def apply(baseAddr: BigInt)(implicit p: Parameters, valName: ValName, sourceInfo: SourceInfo): TLAdapterNode = {
|
||||||
|
LazyModule(new AddressRewriterNode(x => x & baseAddr.U)).node
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -339,11 +339,11 @@ class RadianceTile private (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (radianceParams.useVxCache) {
|
if (radianceParams.useVxCache) {
|
||||||
tlMasterXbar.node := AddressRewriterNode(base) := TLWidthWidget(16) := memNode
|
tlMasterXbar.node := AddressOrNode(base) := TLWidthWidget(16) := memNode
|
||||||
} else {
|
} else {
|
||||||
// imemNodes.foreach { tlMasterXbar.node := TLWidthWidget(4) := _ }
|
// imemNodes.foreach { tlMasterXbar.node := TLWidthWidget(4) := _ }
|
||||||
tlMasterXbar.node :=* AddressRewriterNode(base) :=* icacheNode
|
tlMasterXbar.node :=* AddressOrNode(base) :=* icacheNode
|
||||||
tlMasterXbar.node :=* AddressRewriterNode(base) :=* dcacheNode
|
tlMasterXbar.node :=* AddressOrNode(base) :=* dcacheNode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -351,8 +351,8 @@ class RadianceTile private (
|
|||||||
// TODO: parametrize
|
// TODO: parametrize
|
||||||
val gemmini = LazyModule(new Gemmini(GemminiCustomConfigs.unifiedMemConfig))
|
val gemmini = LazyModule(new Gemmini(GemminiCustomConfigs.unifiedMemConfig))
|
||||||
val roccs: Seq[LazyRoCC] = Seq(gemmini)
|
val roccs: Seq[LazyRoCC] = Seq(gemmini)
|
||||||
tlMasterXbar.node :=* AddressRewriterNode(base) :=* gemmini.atlNode
|
tlMasterXbar.node :=* AddressOrNode(base) :=* gemmini.atlNode
|
||||||
tlOtherMastersNode :=* AddressRewriterNode(base) :=* gemmini.tlNode
|
tlOtherMastersNode :=* AddressOrNode(base) :=* gemmini.tlNode
|
||||||
|
|
||||||
// MMIO
|
// MMIO
|
||||||
gemmini.stlNode :=* TLWidthWidget(4) :=* smemXbar.node
|
gemmini.stlNode :=* TLWidthWidget(4) :=* smemXbar.node
|
||||||
|
|||||||
Reference in New Issue
Block a user