
spinal.lib.bus.amba4.axi.Axi4SharedOnChipRam.scala Maven / Gradle / Ivy
package spinal.lib.bus.amba4.axi
import spinal.core._
import spinal.lib._
object Axi4SharedOnChipRam{
def getAxiConfig(dataWidth : Int,byteCount : BigInt,idWidth : Int) = Axi4Config(
addressWidth = log2Up(byteCount),
dataWidth = dataWidth,
idWidth = idWidth,
useLock = false,
useRegion = false,
useCache = false,
useProt = false,
useQos = false
)
def main(args: Array[String]) {
SpinalVhdl(new Axi4SharedOnChipRam(32,1024,4).setDefinitionName("TopLevel"))
}
}
case class Axi4SharedOnChipRam(dataWidth : Int,byteCount : BigInt,idWidth : Int) extends Component{
val axiConfig = Axi4SharedOnChipRam.getAxiConfig(dataWidth,byteCount,idWidth)
val io = new Bundle {
val axi = slave(Axi4Shared(axiConfig))
}
val wordCount = byteCount / axiConfig.bytePerWord
val ram = Mem(axiConfig.dataType,wordCount.toInt)
val wordRange = log2Up(wordCount) + log2Up(axiConfig.bytePerWord)-1 downto log2Up(axiConfig.bytePerWord)
val arw = io.axi.arw.unburstify
val stage0 = arw.haltWhen(arw.write && !io.axi.writeData.valid)
io.axi.readRsp.data := ram.readWriteSync(
address = stage0.addr(axiConfig.wordRange).resized,
data = io.axi.writeData.data,
enable = stage0.fire,
write = stage0.write,
mask = io.axi.writeData.strb
)
io.axi.writeData.ready := arw.valid && arw.write && stage0.ready
val stage1 = stage0.stage
stage1.ready := (io.axi.readRsp.ready && !stage1.write) || ((io.axi.writeRsp.ready || ! stage1.last) && stage1.write)
io.axi.readRsp.valid := stage1.valid && !stage1.write
io.axi.readRsp.id := stage1.id
io.axi.readRsp.last := stage1.last
io.axi.readRsp.setOKAY()
if(axiConfig.useRUser) io.axi.readRsp.user := stage1.user
io.axi.writeRsp.valid := stage1.valid && stage1.write && stage1.last
io.axi.writeRsp.setOKAY()
io.axi.writeRsp.id := stage1.id
if(axiConfig.useBUser) io.axi.writeRsp.user := stage1.user
io.axi.arw.ready.noBackendCombMerge //Verilator perf
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy