* coreplex collapse: peripherals now in coreplex * coreplex: better factoring of TLBusWrapper attachement points * diplomacy: allow monitorless :*= and :=* * rocket: don't connect monitors to tile tim slave ports * rename chip package to system * coreplex: only sbus has a splitter * TLFragmenter: Continuing my spot battles on requires without explanatory strings * pbus: toFixedWidthSingleBeatSlave * tilelink: more verbose requires * use the new system package for regression * sbus: add more explicit FIFO attachment points * delete leftover top-level utils * cleanup ResetVector and RTC
140 lines
4.5 KiB
Scala
140 lines
4.5 KiB
Scala
// See LICENSE.SiFive for license details.
|
|
|
|
package freechips.rocketchip.amba.axi4
|
|
|
|
import Chisel._
|
|
import freechips.rocketchip.config.Parameters
|
|
import freechips.rocketchip.devices.tilelink._
|
|
import freechips.rocketchip.diplomacy._
|
|
import freechips.rocketchip.tilelink._
|
|
import freechips.rocketchip.unittest._
|
|
|
|
class RRTest0(address: BigInt)(implicit p: Parameters) extends AXI4RegisterRouter(address, 0, 32, 0, 4)(
|
|
new AXI4RegBundle((), _) with RRTest0Bundle)(
|
|
new AXI4RegModule((), _, _) with RRTest0Module)
|
|
|
|
class RRTest1(address: BigInt)(implicit p: Parameters) extends AXI4RegisterRouter(address, 0, 32, 6, 4, false)(
|
|
new AXI4RegBundle((), _) with RRTest1Bundle)(
|
|
new AXI4RegModule((), _, _) with RRTest1Module)
|
|
|
|
class AXI4LiteFuzzRAM(txns: Int)(implicit p: Parameters) extends LazyModule
|
|
{
|
|
val fuzz = LazyModule(new TLFuzzer(txns))
|
|
val model = LazyModule(new TLRAMModel("AXI4LiteFuzzRAM"))
|
|
val xbar = LazyModule(new TLXbar)
|
|
val gpio = LazyModule(new RRTest1(0x400))
|
|
val ram = LazyModule(new AXI4RAM(AddressSet(0x0, 0x3ff)))
|
|
|
|
model.node := fuzz.node
|
|
xbar.node := TLDelayer(0.1)(TLBuffer(BufferParams.flow)(TLDelayer(0.2)(model.node)))
|
|
ram.node := AXI4UserYanker()(AXI4IdIndexer(0)(TLToAXI4(4, true )(TLFragmenter(4, 16)(xbar.node))))
|
|
gpio.node := AXI4UserYanker()(AXI4IdIndexer(0)(TLToAXI4(4, false)(TLFragmenter(4, 16)(xbar.node))))
|
|
|
|
lazy val module = new LazyModuleImp(this) with HasUnitTestIO {
|
|
io.finished := fuzz.module.io.finished
|
|
}
|
|
}
|
|
|
|
class AXI4LiteFuzzRAMTest(txns: Int = 5000, timeout: Int = 500000)(implicit p: Parameters) extends UnitTest(timeout) {
|
|
val dut = Module(LazyModule(new AXI4LiteFuzzRAM(txns)).module)
|
|
io.finished := dut.io.finished
|
|
}
|
|
|
|
class AXI4FullFuzzRAM(txns: Int)(implicit p: Parameters) extends LazyModule
|
|
{
|
|
val fuzz = LazyModule(new TLFuzzer(txns))
|
|
val model = LazyModule(new TLRAMModel("AXI4FullFuzzRAM"))
|
|
val xbar = LazyModule(new TLXbar)
|
|
val gpio = LazyModule(new RRTest0(0x400))
|
|
val ram = LazyModule(new AXI4RAM(AddressSet(0x0, 0x3ff)))
|
|
|
|
model.node := fuzz.node
|
|
xbar.node := TLDelayer(0.1)(TLBuffer(BufferParams.flow)(TLDelayer(0.2)(model.node)))
|
|
ram.node := AXI4Fragmenter()(AXI4Deinterleaver(16)(TLToAXI4(4,false)(xbar.node)))
|
|
gpio.node := AXI4Fragmenter()(AXI4Deinterleaver(16)(TLToAXI4(4,true )(xbar.node)))
|
|
|
|
lazy val module = new LazyModuleImp(this) with HasUnitTestIO {
|
|
io.finished := fuzz.module.io.finished
|
|
}
|
|
}
|
|
|
|
class AXI4FullFuzzRAMTest(txns: Int = 5000, timeout: Int = 500000)(implicit p: Parameters) extends UnitTest(timeout) {
|
|
val dut = Module(LazyModule(new AXI4FullFuzzRAM(txns)).module)
|
|
io.finished := dut.io.finished
|
|
}
|
|
|
|
trait HasFuzzTarget {
|
|
val fuzzAddr = AddressSet(0x0, 0xfff)
|
|
}
|
|
|
|
class AXI4FuzzMaster(txns: Int)(implicit p: Parameters) extends LazyModule with HasFuzzTarget
|
|
{
|
|
val node = AXI4OutputNode()
|
|
val fuzz = LazyModule(new TLFuzzer(txns, overrideAddress = Some(fuzzAddr)))
|
|
val model = LazyModule(new TLRAMModel("AXI4FuzzMaster"))
|
|
|
|
model.node := fuzz.node
|
|
node :=
|
|
AXI4UserYanker()(
|
|
AXI4Deinterleaver(64)(
|
|
TLToAXI4(4)(
|
|
TLDelayer(0.1)(
|
|
TLBuffer(BufferParams.flow)(
|
|
TLDelayer(0.1)(
|
|
model.node))))))
|
|
|
|
lazy val module = new LazyModuleImp(this) {
|
|
val io = new Bundle {
|
|
val out = node.bundleOut
|
|
val finished = Bool(OUTPUT)
|
|
}
|
|
|
|
io.finished := fuzz.module.io.finished
|
|
}
|
|
}
|
|
|
|
class AXI4FuzzSlave()(implicit p: Parameters) extends LazyModule with HasFuzzTarget
|
|
{
|
|
val node = AXI4InputNode()
|
|
val xbar = LazyModule(new TLXbar)
|
|
val ram = LazyModule(new TLRAM(fuzzAddr))
|
|
val error= LazyModule(new TLError(ErrorParams(Seq(AddressSet(0x1800, 0xff)))))
|
|
|
|
ram.node := TLFragmenter(4, 16)(xbar.node)
|
|
error.node := TLFragmenter(4, 16)(xbar.node)
|
|
|
|
xbar.node :=
|
|
TLFIFOFixer()(
|
|
TLDelayer(0.1)(
|
|
TLBuffer(BufferParams.flow)(
|
|
TLDelayer(0.1)(
|
|
AXI4ToTL()(
|
|
AXI4UserYanker(Some(4))(
|
|
AXI4Fragmenter()(
|
|
AXI4IdIndexer(2)(
|
|
node))))))))
|
|
|
|
lazy val module = new LazyModuleImp(this) {
|
|
val io = new Bundle {
|
|
val in = node.bundleIn
|
|
}
|
|
}
|
|
}
|
|
|
|
class AXI4FuzzBridge(txns: Int)(implicit p: Parameters) extends LazyModule
|
|
{
|
|
val master = LazyModule(new AXI4FuzzMaster(txns))
|
|
val slave = LazyModule(new AXI4FuzzSlave)
|
|
|
|
slave.node := master.node
|
|
|
|
lazy val module = new LazyModuleImp(this) with HasUnitTestIO {
|
|
io.finished := master.module.io.finished
|
|
}
|
|
}
|
|
|
|
class AXI4BridgeTest(txns: Int = 5000, timeout: Int = 500000)(implicit p: Parameters) extends UnitTest(timeout) {
|
|
val dut = Module(LazyModule(new AXI4FuzzBridge(txns)).module)
|
|
io.finished := dut.io.finished
|
|
}
|