axi4: add a Filter suitable for manipulating test visibility
This commit is contained in:
parent
bfc0ba679a
commit
72c89f7e30
62
src/main/scala/amba/axi4/Filter.scala
Normal file
62
src/main/scala/amba/axi4/Filter.scala
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
// See LICENSE.SiFive for license details.
|
||||||
|
|
||||||
|
package freechips.rocketchip.amba.axi4
|
||||||
|
|
||||||
|
import Chisel._
|
||||||
|
import freechips.rocketchip.config._
|
||||||
|
import freechips.rocketchip.diplomacy._
|
||||||
|
|
||||||
|
class AXI4Filter(
|
||||||
|
Sfilter: AXI4SlaveParameters => Option[AXI4SlaveParameters] = AXI4Filter.Sidentity,
|
||||||
|
Mfilter: AXI4MasterParameters => Option[AXI4MasterParameters] = AXI4Filter.Midentity
|
||||||
|
)(implicit p: Parameters) extends LazyModule
|
||||||
|
{
|
||||||
|
val node = AXI4AdapterNode(
|
||||||
|
slaveFn = { sp => sp.copy(slaves = sp.slaves.flatMap { s =>
|
||||||
|
val out = Sfilter(s)
|
||||||
|
out.foreach { o => // Confirm the filter only REMOVES capability
|
||||||
|
o.address.foreach { a => require (s.address.map(_.contains(a)).reduce(_||_)) }
|
||||||
|
require (o.regionType <= s.regionType)
|
||||||
|
// we allow executable to be changed both ways
|
||||||
|
require (s.supportsWrite.contains(o.supportsWrite))
|
||||||
|
require (s.supportsRead .contains(o.supportsRead))
|
||||||
|
require (!o.interleavedId.isDefined || s.interleavedId == o.interleavedId)
|
||||||
|
}
|
||||||
|
out
|
||||||
|
})},
|
||||||
|
masterFn = { mp => mp.copy(masters = mp.masters.flatMap { m =>
|
||||||
|
val out = Mfilter(m)
|
||||||
|
out.foreach { o => require (m.id.contains(o.id)) }
|
||||||
|
out
|
||||||
|
})})
|
||||||
|
|
||||||
|
lazy val module = new LazyModuleImp(this) {
|
||||||
|
(node.in zip node.out) foreach { case ((in, edgeIn), (out, edgeOut)) =>
|
||||||
|
out <> in
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object AXI4Filter
|
||||||
|
{
|
||||||
|
def Midentity: AXI4MasterParameters => Option[AXI4MasterParameters] = { m => Some(m) }
|
||||||
|
def Sidentity: AXI4SlaveParameters => Option[AXI4SlaveParameters] = { s => Some(s) }
|
||||||
|
def Smask(select: AddressSet): AXI4SlaveParameters => Option[AXI4SlaveParameters] = { s =>
|
||||||
|
val filtered = s.address.map(_.intersect(select)).flatten
|
||||||
|
val alignment = select.alignment /* alignment 0 means 'select' selected everything */
|
||||||
|
val maxTransfer = 1 << 30
|
||||||
|
val capTransfer = if (alignment == 0 || alignment > maxTransfer) maxTransfer else alignment.toInt
|
||||||
|
val cap = TransferSizes(1, capTransfer)
|
||||||
|
if (filtered.isEmpty) { None } else {
|
||||||
|
Some(s.copy(
|
||||||
|
address = filtered,
|
||||||
|
supportsWrite = s.supportsWrite.intersect(cap),
|
||||||
|
supportsRead = s.supportsRead .intersect(cap)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
def apply(
|
||||||
|
Sfilter: AXI4SlaveParameters => Option[AXI4SlaveParameters] = AXI4Filter.Sidentity,
|
||||||
|
Mfilter: AXI4MasterParameters => Option[AXI4MasterParameters] = AXI4Filter.Midentity
|
||||||
|
)(implicit p: Parameters): AXI4Node = LazyModule(new AXI4Filter(Sfilter, Mfilter)).node
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user