From 27df04354f359d3120f35d2c4381a48b8b63db62 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Wed, 25 Nov 2015 20:04:31 -0800 Subject: [PATCH] Add ROM with NASTI interface --- uncore/src/main/scala/NastiROM.scala | 30 ++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 uncore/src/main/scala/NastiROM.scala diff --git a/uncore/src/main/scala/NastiROM.scala b/uncore/src/main/scala/NastiROM.scala new file mode 100644 index 00000000..ba1cef66 --- /dev/null +++ b/uncore/src/main/scala/NastiROM.scala @@ -0,0 +1,30 @@ +package uncore + +import Chisel._ +import junctions._ +import cde.{Parameters, Field} + +class NastiROM(contents: Seq[Byte])(implicit p: Parameters) extends Module { + val io = new NastiIO().flip + val ar = Queue(io.ar, 1) + + // This assumes ROMs are in read-only parts of the address map. + // Reuse b_queue code from NastiErrorSlave if this assumption is bad. + when (ar.valid) { assert(ar.bits.len === UInt(0), "Can't burst-read from NastiROM") } + assert(!(io.aw.valid || io.w.valid), "Can't write to NastiROM") + io.aw.ready := Bool(false) + io.w.ready := Bool(false) + io.b.valid := Bool(false) + + val byteWidth = io.r.bits.nastiXDataBits / 8 + val rows = (contents.size + byteWidth - 1)/byteWidth + 1 + val rom = Vec.tabulate(rows) { i => + val slice = contents.slice(i*byteWidth, (i+1)*byteWidth) + UInt(slice.foldRight(BigInt(0)) { case (x,y) => (y << 8) + (x.toInt & 0xFF) }) + } + val rdata_word = rom(if (rows == 1) UInt(0) else ar.bits.addr(log2Up(contents.size)-1,log2Up(byteWidth))) + val rdata = new LoadGen(Cat(UInt(1), ar.bits.size), ar.bits.addr, rdata_word, Bool(false), byteWidth).data + + io.r <> ar + io.r.bits := NastiReadDataChannel(ar.bits.id, rdata) +}