Untitled
unknown
plain_text
5 months ago
1.8 kB
2
Indexable
package acal_lab04.Lab import chisel3._ import chisel3.util._ import chisel3.util.log2Ceil class MultiShareBus(val addrWidth: Int,val dataWidth: Int,val numMasters: Int,val numSlaves: Int, val addrMap: Seq[(Int, Int)]) extends Module { val io = IO(new Bundle { val masters = Vec(numMasters, Flipped(Decoupled(new MasterInterface(addrWidth, dataWidth)))) val slaves = Vec(numSlaves, Decoupled(new SlaveInterface(addrWidth, dataWidth))) }) // decoder val decoders = Seq.tabulate(numSlaves) { i => Module(new Decoder(addrWidth, addrMap.slice(i, i+1))) } // initialize the ready signal for(i <- 0 until numMasters){ io.masters(i).ready := false.B } // // two master arbiter (round robin) // // use one bit to record which master is last granted val lastGrant = RegInit(0.U(1.W)) val tranDone = Wire(Bool()) val request = Wire(Bool()) // OR all valid signals from masters request := io.masters.map(_.valid).reduce(_ || _) // the arbiter is idle (no request) or previous transaction has done tranDone:= !request || io.masters(lastGrant).valid && io.masters(lastGrant).ready when(request && tranDone){ lastGrant := ~lastGrant } io.masters(lastGrant).ready := io.slaves.map(_.ready).reduce(_ || _) // OR all ready signals // Initialize signals for (i <- 0 until numSlaves) { io.slaves(i).valid := io.masters(lastGrant).valid && decoders(i).io.select io.slaves(i).bits.addr := io.masters(lastGrant).bits.addr io.slaves(i).bits.data := io.masters(lastGrant).bits.data io.slaves(i).bits.size := io.masters(lastGrant).bits.size decoders(i).io.addr := io.masters(lastGrant).bits.addr } }
Editor is loading...
Leave a Comment