feat: 增加cache至axi的转接桥

This commit is contained in:
Liphen 2023-11-13 15:55:16 +08:00
parent e266678e90
commit 401149f111
1 changed files with 65 additions and 60 deletions

View File

@ -10,71 +10,76 @@ class CacheAXIInterface extends Module {
val dcache = Flipped(new DCache_AXIInterface())
val axi = new AXI()
})
val ar_sel = Wire(Bool())
val ar_sel_lock = RegInit(false.B)
val ar_sel_lock_val = RegInit(false.B)
// pass-through aw {
io.axi.aw.id := io.dcache.aw.id
io.axi.aw.addr := io.dcache.aw.addr
io.axi.aw.len := io.dcache.aw.len
io.axi.aw.size := io.dcache.aw.size
io.axi.aw.burst := io.dcache.aw.burst
io.axi.aw.valid := io.dcache.aw.valid
io.axi.aw.prot := io.dcache.aw.prot
io.axi.aw.cache := io.dcache.aw.cache
io.axi.aw.lock := io.dcache.aw.lock
io.dcache.aw.ready := io.axi.aw.ready
// pass-through aw }
// pass-through w {
io.axi.w.id := io.dcache.w.id
io.axi.w.data := io.dcache.w.data
io.axi.w.strb := io.dcache.w.strb
io.axi.w.last := io.dcache.w.last
io.axi.w.valid := io.dcache.w.valid
io.dcache.w.ready := io.axi.w.ready
// pass-through aw }
// pass-through b {
io.dcache.b.id := io.axi.b.id
io.dcache.b.valid := io.axi.b.valid
io.dcache.b.resp := io.axi.b.resp
io.axi.b.ready := io.dcache.b.ready
// pass-through b }
// mux ar {
// we need to lock ar to avoid signals change during handshake
val ar_sel_lock = RegInit(false.B)
val ar_sel_val = RegInit(false.B)
val ar_sel = Mux(ar_sel_lock, ar_sel_val, io.dcache.ar.valid)
when(io.axi.ar.valid) {
when(io.axi.ar.ready) {
ar_sel_lock := false.B
}.otherwise {
ar_sel_lock := true.B
ar_sel_lock_val := ar_sel
ar_sel_lock := true.B
ar_sel_val := ar_sel
}
}
io.axi.ar.id := Cat(0.U(3.W), ar_sel)
io.axi.ar.addr := Mux(ar_sel, io.dcache.ar.addr, io.icache.ar.addr)
io.axi.ar.len := Mux(ar_sel, io.dcache.ar.len, io.icache.ar.len)
io.axi.ar.size := Mux(ar_sel, io.dcache.ar.size, io.icache.ar.size)
io.axi.ar.burst := Mux(ar_sel, io.dcache.ar.burst, io.icache.ar.burst)
io.axi.ar.valid := Mux(ar_sel, io.dcache.ar.valid, io.icache.ar.valid)
io.axi.ar.prot := Mux(ar_sel, io.dcache.ar.prot, io.icache.ar.prot)
io.axi.ar.cache := Mux(ar_sel, io.dcache.ar.cache, io.icache.ar.cache)
io.axi.ar.lock := Mux(ar_sel, io.dcache.ar.lock, io.icache.ar.lock)
io.icache.ar.ready := !ar_sel && io.axi.ar.ready
io.dcache.ar.ready := ar_sel && io.axi.ar.ready
// mux ar }
ar_sel := Mux(ar_sel_lock, ar_sel_lock_val, !io.icache.ar.valid && io.dcache.ar.valid)
val r_sel = io.axi.r.bits.id(0)
// ===----------------------------------------------------------------===
// dcache
// ===----------------------------------------------------------------===
io.dcache.ar.ready := io.axi.ar.ready && ar_sel
io.dcache.r.bits.data := Mux(r_sel, io.axi.r.bits.data, 0.U)
io.dcache.r.bits.last := Mux(r_sel, io.axi.r.bits.last, 0.U)
io.dcache.r.valid := Mux(r_sel, io.axi.r.valid, 0.U)
io.dcache.aw.ready := io.axi.aw.ready
io.dcache.w.ready := io.axi.w.ready
io.dcache.b.valid := io.axi.b.valid
// ===----------------------------------------------------------------===
// icache
// ===----------------------------------------------------------------===
io.icache.ar.ready := io.axi.ar.ready && !ar_sel
io.icache.r.bits.data := Mux(!r_sel, io.axi.r.bits.data, 0.U)
io.icache.r.bits.last := Mux(!r_sel, io.axi.r.bits.last, 0.U)
io.icache.r.valid := Mux(!r_sel, io.axi.r.valid, 0.U)
// ===----------------------------------------------------------------===
// axi
// ===----------------------------------------------------------------===
io.axi.ar.bits.id := ar_sel
io.axi.ar.bits.addr := Mux(ar_sel, io.dcache.ar.bits.addr, io.icache.ar.bits.addr)
io.axi.ar.bits.len := Mux(ar_sel, io.dcache.ar.bits.len, io.icache.ar.bits.len)
io.axi.ar.bits.size := Mux(ar_sel, io.dcache.ar.bits.size, io.icache.ar.bits.size)
io.axi.ar.bits.burst := 1.U
io.axi.ar.bits.lock := 0.U
io.axi.ar.bits.cache := 0.U
io.axi.ar.bits.prot := 0.U
io.axi.ar.valid := Mux(ar_sel, io.dcache.ar.valid, io.icache.ar.valid)
io.axi.r.ready := Mux(~r_sel, io.icache.r.ready, io.dcache.r.ready)
io.axi.aw.bits.id := 0.U
io.axi.aw.bits.addr := io.dcache.aw.bits.addr
io.axi.aw.bits.len := io.dcache.aw.bits.len
io.axi.aw.bits.size := io.dcache.aw.bits.size
io.axi.aw.bits.burst := 1.U
io.axi.aw.bits.lock := 0.U
io.axi.aw.bits.cache := 0.U
io.axi.aw.bits.prot := 0.U
io.axi.aw.valid := io.dcache.aw.valid
io.axi.w.bits.id := 0.U
io.axi.w.bits.data := io.dcache.w.bits.data
io.axi.w.bits.strb := io.dcache.w.bits.strb
io.axi.w.bits.last := io.dcache.w.bits.last
io.axi.w.valid := io.dcache.w.valid
io.axi.b.ready := io.dcache.b.ready
// mux r based on rid {
val r_sel = io.axi.r.id(0)
io.icache.r.id := io.axi.r.id
io.icache.r.data := io.axi.r.data
io.icache.r.resp := io.axi.r.resp
io.icache.r.last := io.axi.r.last
io.icache.r.valid := !r_sel && io.axi.r.valid
io.dcache.r.id := io.axi.r.id
io.dcache.r.data := io.axi.r.data
io.dcache.r.resp := io.axi.r.resp
io.dcache.r.last := io.axi.r.last
io.dcache.r.valid := r_sel && io.axi.r.valid
io.axi.r.ready := Mux(r_sel, io.dcache.r.ready, io.icache.r.ready)
// mux r based on rid }
}