1
0

reduce MemIFTag size, enable non pow2 HellaFLowQueue size

This commit is contained in:
Henry Cook 2015-03-05 13:13:12 -08:00
parent 1bed6ea498
commit 8e41fcf6fc

View File

@ -244,20 +244,13 @@ class MemIOTileLinkIOConverter(qDepth: Int) extends Module {
(io.tl.release.fire() && rel_has_data), tlDataBeats) (io.tl.release.fire() && rel_has_data), tlDataBeats)
val tl_done_out = Reg(init=Bool(false)) val tl_done_out = Reg(init=Bool(false))
val make_grant_ack = Reg(init=Bool(false)) val make_grant_ack = Reg(init=Bool(false))
val grant_for_rel = Grant(
is_builtin_type = Bool(true),
g_type = Grant.voluntaryAckType,
client_xact_id = tag_out,
manager_xact_id = UInt(0))
val grant_for_acq_write = ManagerMetadata.onReset.makeGrant(
acq = Acquire(
is_builtin_type = tag_out(0),
a_type = tag_out >> UInt(1),
client_xact_id = tag_out >> UInt(io.tl.tlAcquireTypeBits+1),
addr_block = UInt(0)), //DNC
manager_xact_id = UInt(0))
gnt_arb.io.in(1).valid := Bool(false) gnt_arb.io.in(1).valid := Bool(false)
gnt_arb.io.in(1).bits.payload := Mux(data_from_rel, grant_for_rel, grant_for_acq_write) gnt_arb.io.in(1).bits.payload := Grant(
is_builtin_type = Bool(true),
g_type = Mux(data_from_rel, Grant.voluntaryAckType, Grant.ackType),
client_xact_id = tag_out >> UInt(1),
manager_xact_id = UInt(0))
if(tlDataBits != mifDataBits || tlDataBeats != mifDataBeats) { if(tlDataBits != mifDataBits || tlDataBeats != mifDataBeats) {
val mem_cmd_q = Module(new Queue(new MemReqCmd, qDepth)) val mem_cmd_q = Module(new Queue(new MemReqCmd, qDepth))
@ -278,7 +271,8 @@ class MemIOTileLinkIOConverter(qDepth: Int) extends Module {
when(io.tl.release.valid) { when(io.tl.release.valid) {
active_out := Bool(true) active_out := Bool(true)
cmd_sent_out := Bool(false) cmd_sent_out := Bool(false)
tag_out := io.tl.release.bits.payload.client_xact_id tag_out := Cat(io.tl.release.bits.payload.client_xact_id,
io.tl.release.bits.payload.isVoluntary())
addr_out := io.tl.release.bits.payload.addr_block addr_out := io.tl.release.bits.payload.addr_block
has_data := rel_has_data has_data := rel_has_data
data_from_rel := Bool(true) data_from_rel := Bool(true)
@ -289,8 +283,7 @@ class MemIOTileLinkIOConverter(qDepth: Int) extends Module {
active_out := Bool(true) active_out := Bool(true)
cmd_sent_out := Bool(false) cmd_sent_out := Bool(false)
tag_out := Cat(io.tl.acquire.bits.payload.client_xact_id, tag_out := Cat(io.tl.acquire.bits.payload.client_xact_id,
io.tl.acquire.bits.payload.a_type, io.tl.acquire.bits.payload.isBuiltInType())
io.tl.acquire.bits.payload.is_builtin_type)
addr_out := io.tl.acquire.bits.payload.addr_block addr_out := io.tl.acquire.bits.payload.addr_block
has_data := acq_has_data has_data := acq_has_data
data_from_rel := Bool(false) data_from_rel := Bool(false)
@ -358,7 +351,8 @@ class MemIOTileLinkIOConverter(qDepth: Int) extends Module {
data_from_rel := Bool(true) data_from_rel := Bool(true)
make_grant_ack := Bool(true) make_grant_ack := Bool(true)
io.mem.req_cmd.bits.rw := rel_has_data io.mem.req_cmd.bits.rw := rel_has_data
io.mem.req_cmd.bits.tag := io.tl.release.bits.payload.client_xact_id io.mem.req_cmd.bits.tag := Cat(io.tl.release.bits.payload.client_xact_id,
io.tl.release.bits.payload.isVoluntary())
io.mem.req_cmd.bits.addr := io.tl.release.bits.payload.addr_block io.mem.req_cmd.bits.addr := io.tl.release.bits.payload.addr_block
io.mem.req_data.bits.data := io.tl.release.bits.payload.data io.mem.req_data.bits.data := io.tl.release.bits.payload.data
} .elsewhen(io.tl.acquire.valid) { } .elsewhen(io.tl.acquire.valid) {
@ -366,8 +360,7 @@ class MemIOTileLinkIOConverter(qDepth: Int) extends Module {
make_grant_ack := acq_has_data make_grant_ack := acq_has_data
io.mem.req_cmd.bits.rw := acq_has_data io.mem.req_cmd.bits.rw := acq_has_data
io.mem.req_cmd.bits.tag := Cat(io.tl.acquire.bits.payload.client_xact_id, io.mem.req_cmd.bits.tag := Cat(io.tl.acquire.bits.payload.client_xact_id,
io.tl.acquire.bits.payload.a_type, io.tl.acquire.bits.payload.isBuiltInType())
io.tl.acquire.bits.payload.is_builtin_type)
io.mem.req_cmd.bits.addr := io.tl.acquire.bits.payload.addr_block io.mem.req_cmd.bits.addr := io.tl.acquire.bits.payload.addr_block
io.mem.req_data.bits.data := io.tl.acquire.bits.payload.data io.mem.req_data.bits.data := io.tl.acquire.bits.payload.data
} }
@ -409,12 +402,12 @@ class MemIOTileLinkIOConverter(qDepth: Int) extends Module {
tl_buf_in := tl_buf_in.fromBits(mif_buf_in.toBits) tl_buf_in := tl_buf_in.fromBits(mif_buf_in.toBits)
val tl_prog_in = (tl_cnt_in+UInt(1, width = log2Up(tlDataBeats+1)))*UInt(tlDataBits) val tl_prog_in = (tl_cnt_in+UInt(1, width = log2Up(tlDataBeats+1)))*UInt(tlDataBits)
val mif_prog_in = mif_cnt_in*UInt(mifDataBits) val mif_prog_in = mif_cnt_in*UInt(mifDataBits)
gnt_arb.io.in(0).bits.payload := ManagerMetadata.onReset.makeGrant( gnt_arb.io.in(0).bits.payload := Grant(
acq = Acquire(
is_builtin_type = tag_in(0), is_builtin_type = tag_in(0),
a_type = tag_in >> UInt(1), g_type = Mux(tag_in(0),
client_xact_id = tag_in >> UInt(io.tl.tlAcquireTypeBits+1), Grant.dataBlockType,
addr_block = UInt(0)), //DNC UInt(0)), // TODO: Assumes MI or MEI protocol
client_xact_id = tag_in >> UInt(1),
manager_xact_id = UInt(0), manager_xact_id = UInt(0),
addr_beat = tl_cnt_in, addr_beat = tl_cnt_in,
data = tl_buf_in(tl_cnt_in)) data = tl_buf_in(tl_cnt_in))
@ -442,13 +435,12 @@ class MemIOTileLinkIOConverter(qDepth: Int) extends Module {
} else { // Don't generate all the uneeded data buffers and flow resp } else { // Don't generate all the uneeded data buffers and flow resp
gnt_arb.io.in(0).valid := io.mem.resp.valid gnt_arb.io.in(0).valid := io.mem.resp.valid
io.mem.resp.ready := gnt_arb.io.in(0).ready io.mem.resp.ready := gnt_arb.io.in(0).ready
gnt_arb.io.in(0).bits.payload := gnt_arb.io.in(0).bits.payload := Grant(
ManagerMetadata.onReset.makeGrant(
acq = Acquire(
is_builtin_type = io.mem.resp.bits.tag(0), is_builtin_type = io.mem.resp.bits.tag(0),
a_type = io.mem.resp.bits.tag >> UInt(1), g_type = Mux(io.mem.resp.bits.tag(0),
client_xact_id = io.mem.resp.bits.tag >> UInt(io.tl.tlAcquireTypeBits+1), Grant.dataBlockType,
addr_block = UInt(0)), //DNC UInt(0)), // TODO: Assumes MI or MEI protocol
client_xact_id = io.mem.resp.bits.tag >> UInt(1),
manager_xact_id = UInt(0), manager_xact_id = UInt(0),
addr_beat = tl_cnt_in, addr_beat = tl_cnt_in,
data = io.mem.resp.bits.data) data = io.mem.resp.bits.data)
@ -458,7 +450,7 @@ class MemIOTileLinkIOConverter(qDepth: Int) extends Module {
class HellaFlowQueue[T <: Data](val entries: Int)(data: => T) extends Module class HellaFlowQueue[T <: Data](val entries: Int)(data: => T) extends Module
{ {
val io = new QueueIO(data, entries) val io = new QueueIO(data, entries)
require(isPow2(entries) && entries > 1) require(entries > 1)
val do_flow = Bool() val do_flow = Bool()
val do_enq = io.enq.fire() && !do_flow val do_enq = io.enq.fire() && !do_flow
@ -466,7 +458,7 @@ class HellaFlowQueue[T <: Data](val entries: Int)(data: => T) extends Module
val maybe_full = Reg(init=Bool(false)) val maybe_full = Reg(init=Bool(false))
val enq_ptr = Counter(do_enq, entries)._1 val enq_ptr = Counter(do_enq, entries)._1
val deq_ptr = Counter(do_deq, entries)._1 val (deq_ptr, deq_done) = Counter(do_deq, entries)
when (do_enq != do_deq) { maybe_full := do_enq } when (do_enq != do_deq) { maybe_full := do_enq }
val ptr_match = enq_ptr === deq_ptr val ptr_match = enq_ptr === deq_ptr
@ -482,7 +474,7 @@ class HellaFlowQueue[T <: Data](val entries: Int)(data: => T) extends Module
when (do_enq) { ram(enq_ptr) := io.enq.bits } when (do_enq) { ram(enq_ptr) := io.enq.bits }
when (io.deq.ready && (atLeastTwo || !io.deq.valid && !empty)) { when (io.deq.ready && (atLeastTwo || !io.deq.valid && !empty)) {
ram_out_valid := Bool(true) ram_out_valid := Bool(true)
ram_addr := Mux(io.deq.valid, deq_ptr + UInt(1), deq_ptr) ram_addr := Mux(io.deq.valid, Mux(deq_done, UInt(0), deq_ptr + UInt(1)), deq_ptr)
} }
io.deq.valid := Mux(empty, io.enq.valid, ram_out_valid) io.deq.valid := Mux(empty, io.enq.valid, ram_out_valid)