2012-02-26 02:09:26 +01:00
|
|
|
package rocket
|
2011-10-26 08:02:47 +02:00
|
|
|
|
|
|
|
import Chisel._;
|
|
|
|
import Node._;
|
|
|
|
import Constants._;
|
|
|
|
|
2012-02-20 09:51:48 +01:00
|
|
|
class rocketMemArbiter(n: Int) extends Component {
|
2012-02-29 12:08:04 +01:00
|
|
|
val io = new Bundle {
|
|
|
|
val mem = new ioTileLink
|
|
|
|
val requestor = Vec(n) { new ioTileLink().flip }
|
|
|
|
}
|
2011-10-26 08:02:47 +02:00
|
|
|
|
2012-02-20 09:51:48 +01:00
|
|
|
var req_val = Bool(false)
|
2012-02-29 12:08:04 +01:00
|
|
|
var req_rdy = io.mem.xact_init.ready
|
2012-02-20 09:51:48 +01:00
|
|
|
for (i <- 0 until n)
|
|
|
|
{
|
2012-02-29 12:08:04 +01:00
|
|
|
io.requestor(i).xact_init.ready := req_rdy
|
|
|
|
req_val = req_val || io.requestor(i).xact_init.valid
|
|
|
|
req_rdy = req_rdy && !io.requestor(i).xact_init.valid
|
2012-02-20 09:51:48 +01:00
|
|
|
}
|
2011-10-26 08:02:47 +02:00
|
|
|
|
2012-02-29 12:08:04 +01:00
|
|
|
// if more than one requestor at a time can write back, the data
|
|
|
|
// arbiter needs to be made stateful: one xact's write data must
|
|
|
|
// be sent to the memory system contiguously.
|
2012-02-29 03:59:15 +01:00
|
|
|
var req_data_val = Bool(false)
|
2012-02-29 12:08:04 +01:00
|
|
|
var req_data_rdy = io.mem.xact_init_data.ready
|
2012-02-29 03:59:15 +01:00
|
|
|
for (i <- 0 until n)
|
|
|
|
{
|
2012-02-29 12:08:04 +01:00
|
|
|
io.requestor(i).xact_init_data.ready := req_data_rdy
|
|
|
|
req_data_val = req_data_val || io.requestor(i).xact_init_data.valid
|
|
|
|
req_data_rdy = req_data_rdy && !io.requestor(i).xact_init_data.valid
|
2012-02-29 03:59:15 +01:00
|
|
|
}
|
|
|
|
|
2012-02-29 12:08:04 +01:00
|
|
|
var req_bits = Wire() { new TransactionInit }
|
|
|
|
req_bits := io.requestor(n-1).xact_init.bits
|
|
|
|
req_bits.tile_xact_id := Cat(io.requestor(n-1).xact_init.bits.tile_xact_id, UFix(n-1, log2up(n)))
|
|
|
|
for (i <- n-2 to 0 by -1)
|
2012-02-20 09:51:48 +01:00
|
|
|
{
|
2012-02-29 12:08:04 +01:00
|
|
|
var my_req_bits = Wire() { new TransactionInit }
|
|
|
|
my_req_bits := io.requestor(i).xact_init.bits
|
|
|
|
my_req_bits.tile_xact_id := Cat(io.requestor(i).xact_init.bits.tile_xact_id, UFix(i, log2up(n)))
|
|
|
|
|
|
|
|
req_bits = Mux(io.requestor(i).xact_init.valid, my_req_bits, req_bits)
|
2012-02-20 09:51:48 +01:00
|
|
|
}
|
2011-10-26 08:02:47 +02:00
|
|
|
|
2012-02-29 12:08:04 +01:00
|
|
|
var req_data_bits = io.requestor(n-1).xact_init_data.bits
|
|
|
|
for (i <- n-2 to 0 by -1)
|
|
|
|
req_data_bits = Mux(io.requestor(i).xact_init_data.valid, io.requestor(i).xact_init_data.bits, req_data_bits)
|
2012-02-29 03:59:15 +01:00
|
|
|
|
2012-02-29 12:08:04 +01:00
|
|
|
io.mem.xact_init.valid := req_val
|
|
|
|
io.mem.xact_init.bits := req_bits
|
2011-10-26 08:02:47 +02:00
|
|
|
|
2012-02-29 12:08:04 +01:00
|
|
|
io.mem.xact_init_data.valid := req_data_val
|
|
|
|
io.mem.xact_init_data.bits := req_data_bits
|
2012-02-29 03:59:15 +01:00
|
|
|
|
2012-02-20 09:51:48 +01:00
|
|
|
for (i <- 0 until n)
|
|
|
|
{
|
2012-02-29 12:08:04 +01:00
|
|
|
val tag = io.mem.xact_rep.bits.tile_xact_id
|
|
|
|
io.requestor(i).xact_rep.valid := io.mem.xact_rep.valid && tag(log2up(n)-1,0) === UFix(i)
|
|
|
|
io.requestor(i).xact_rep.bits.data := io.mem.xact_rep.bits.data
|
|
|
|
io.requestor(i).xact_rep.bits.t_type := io.mem.xact_rep.bits.t_type
|
|
|
|
io.requestor(i).xact_rep.bits.tile_xact_id := tag >> UFix(log2up(n))
|
|
|
|
io.requestor(i).xact_rep.bits.global_xact_id := io.mem.xact_rep.bits.global_xact_id
|
2012-02-20 09:51:48 +01:00
|
|
|
}
|
2011-10-26 08:02:47 +02:00
|
|
|
}
|