pass closure to generate bank addr
This commit is contained in:
parent
26ed805862
commit
6a69d7d7b5
@ -11,27 +11,20 @@ import scala.collection.mutable.ArrayBuffer
|
|||||||
import scala.collection.mutable.HashMap
|
import scala.collection.mutable.HashMap
|
||||||
|
|
||||||
object TileLinkHeaderAppender {
|
object TileLinkHeaderAppender {
|
||||||
def apply[T <: SourcedMessage with HasPhysicalAddress, U <: SourcedMessage with HasMemData](meta: ClientSourcedIO[LogicalNetworkIO[T]], data: ClientSourcedIO[LogicalNetworkIO[U]], clientId: Int, nBanks: Int, bankIdLsb: Int)(implicit conf: UncoreConfiguration) = {
|
def apply[T <: SourcedMessage with HasPhysicalAddress, U <: SourcedMessage with HasMemData](meta: ClientSourcedIO[LogicalNetworkIO[T]], data: ClientSourcedIO[LogicalNetworkIO[U]], clientId: Int, addrConvert: (UFix, Int, Int) => UFix)(implicit conf: UncoreConfiguration) = {
|
||||||
val shim = (new TileLinkHeaderAppenderWithData(clientId, nBanks, bankIdLsb)){meta.bits.payload.clone}{data.bits.payload.clone}
|
val shim = (new TileLinkHeaderAppenderWithData(clientId, addrConvert)){meta.bits.payload.clone}{data.bits.payload.clone}
|
||||||
shim.io.meta_in <> meta
|
shim.io.meta_in <> meta
|
||||||
shim.io.data_in <> data
|
shim.io.data_in <> data
|
||||||
(shim.io.meta_out, shim.io.data_out)
|
(shim.io.meta_out, shim.io.data_out)
|
||||||
}
|
}
|
||||||
def apply[T <: SourcedMessage with HasPhysicalAddress](meta: ClientSourcedIO[LogicalNetworkIO[T]], clientId: Int, nBanks: Int, bankIdLsb: Int)(implicit conf: UncoreConfiguration) = {
|
def apply[T <: SourcedMessage with HasPhysicalAddress](meta: ClientSourcedIO[LogicalNetworkIO[T]], clientId: Int, nBanks: Int, bankIdLsb: Int)(implicit conf: UncoreConfiguration) = {
|
||||||
val shim = (new TileLinkHeaderAppender(clientId, nBanks, bankIdLsb)){meta.bits.payload.clone}
|
val shim = (new TileLinkHeaderAppender(clientId, addrConvert)){meta.bits.payload.clone}
|
||||||
shim.io.meta_in <> meta
|
shim.io.meta_in <> meta
|
||||||
shim.io.meta_out
|
shim.io.meta_out
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class AddressConverter extends Component {
|
class TileLinkHeaderAppenderWithData[T <: SourcedMessage with HasPhysicalAddress, U <: SourcedMessage with HasMemData](clientId: Int, addrConvert: (UFix, Int, Int) => UFix)(metadata: => T)(data: => U)(implicit conf: UncoreConfiguration) extends Component{
|
||||||
def convertAddrToBank(addr: Bits, n: Int, lsb: Int): UFix = {
|
|
||||||
require(lsb + log2Up(n) < PADDR_BITS - OFFSET_BITS, {println("Invalid bits for bank multiplexing.")})
|
|
||||||
addr(lsb + log2Up(n) - 1, lsb)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class TileLinkHeaderAppenderWithData[T <: SourcedMessage with HasPhysicalAddress, U <: SourcedMessage with HasMemData](clientId: Int, nBanks: Int, bankIdLsb: Int)(metadata: => T)(data: => U)(implicit conf: UncoreConfiguration) extends AddressConverter {
|
|
||||||
implicit val ln = conf.ln
|
implicit val ln = conf.ln
|
||||||
val io = new Bundle {
|
val io = new Bundle {
|
||||||
val meta_in = (new ClientSourcedIO){(new LogicalNetworkIO){ metadata }}.flip
|
val meta_in = (new ClientSourcedIO){(new LogicalNetworkIO){ metadata }}.flip
|
||||||
@ -61,10 +54,10 @@ class TileLinkHeaderAppenderWithData[T <: SourcedMessage with HasPhysicalAddress
|
|||||||
|
|
||||||
io.meta_out.bits.payload := meta_q.bits.payload
|
io.meta_out.bits.payload := meta_q.bits.payload
|
||||||
io.meta_out.bits.header.src := UFix(clientId)
|
io.meta_out.bits.header.src := UFix(clientId)
|
||||||
io.meta_out.bits.header.dst := convertAddrToBank(meta_q.bits.payload.addr, nBanks, bankIdLsb)
|
io.meta_out.bits.header.dst := addrConvert(meta_q.bits.payload.addr)
|
||||||
io.data_out.bits.payload := meta_q.bits.payload
|
io.data_out.bits.payload := meta_q.bits.payload
|
||||||
io.data_out.bits.header.src := UFix(clientId)
|
io.data_out.bits.header.src := UFix(clientId)
|
||||||
io.data_out.bits.header.dst := convertAddrToBank(addr_q.io.deq.bits, nBanks, bankIdLsb)
|
io.data_out.bits.header.dst := addrConvert(addr_q.io.deq.bits)
|
||||||
addr_q.io.enq.bits := meta_q.bits.payload.addr
|
addr_q.io.enq.bits := meta_q.bits.payload.addr
|
||||||
|
|
||||||
io.meta_out.valid := meta_q.valid && addr_q.io.enq.ready
|
io.meta_out.valid := meta_q.valid && addr_q.io.enq.ready
|
||||||
@ -83,7 +76,7 @@ class TileLinkHeaderAppenderWithData[T <: SourcedMessage with HasPhysicalAddress
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class TileLinkHeaderAppender[T <: SourcedMessage with HasPhysicalAddress](clientId: Int, nBanks: Int, bankIdLsb: Int)(metadata: => T)(implicit conf: UncoreConfiguration) extends AddressConverter {
|
class TileLinkHeaderAppender[T <: SourcedMessage with HasPhysicalAddress](clientId: Int, addrConvert: (UFix, Int, Int) => UFix)(metadata: => T)(implicit conf: UncoreConfiguration) extends AddressConverter {
|
||||||
implicit val ln = conf.ln
|
implicit val ln = conf.ln
|
||||||
val io = new Bundle {
|
val io = new Bundle {
|
||||||
val meta_in = (new ClientSourcedIO){(new LogicalNetworkIO){ metadata }}.flip
|
val meta_in = (new ClientSourcedIO){(new LogicalNetworkIO){ metadata }}.flip
|
||||||
@ -97,7 +90,7 @@ class TileLinkHeaderAppender[T <: SourcedMessage with HasPhysicalAddress](client
|
|||||||
if(nBanks == 1) {
|
if(nBanks == 1) {
|
||||||
io.meta_out.bits.header.dst := UFix(0)
|
io.meta_out.bits.header.dst := UFix(0)
|
||||||
} else {
|
} else {
|
||||||
io.meta_out.bits.header.dst := convertAddrToBank(meta_q.bits.payload.addr, nBanks, bankIdLsb)
|
io.meta_out.bits.header.dst := addrConvert(meta_q.bits.payload.addr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -405,13 +398,18 @@ class Uncore(htif_width: Int, tileList: Seq[ClientCoherenceAgent])(implicit conf
|
|||||||
outmemsys.io.mem_backup_en <> io.mem_backup_en
|
outmemsys.io.mem_backup_en <> io.mem_backup_en
|
||||||
|
|
||||||
// Add networking headers and endpoint queues
|
// Add networking headers and endpoint queues
|
||||||
|
def convertAddrToBank(addr: Bits): UFix = {
|
||||||
|
require(bankIdLsb + log2Up(nBanks) < PADDR_BITS - OFFSET_BITS, {println("Invalid bits for bank multiplexing.")})
|
||||||
|
addr(bankIdLsb + log2Up(nBanks) - 1, bankIdLsb)
|
||||||
|
}
|
||||||
|
|
||||||
(outmemsys.io.tiles :+ outmemsys.io.htif).zip(io.tiles :+ htif.io.mem).zipWithIndex.map {
|
(outmemsys.io.tiles :+ outmemsys.io.htif).zip(io.tiles :+ htif.io.mem).zipWithIndex.map {
|
||||||
case ((outer, client), i) =>
|
case ((outer, client), i) =>
|
||||||
val (acq_w_header, acq_data_w_header) = TileLinkHeaderAppender(client.acquire, client.acquire_data, i, nBanks, bankIdLsb)
|
val (acq_w_header, acq_data_w_header) = TileLinkHeaderAppender(client.acquire, client.acquire_data, i, convertAddrToBank)
|
||||||
outer.acquire <> acq_w_header
|
outer.acquire <> acq_w_header
|
||||||
outer.acquire_data <> acq_data_w_header
|
outer.acquire_data <> acq_data_w_header
|
||||||
|
|
||||||
val (rel_w_header, rel_data_w_header) = TileLinkHeaderAppender(client.release, client.release_data, i, nBanks, bankIdLsb)
|
val (rel_w_header, rel_data_w_header) = TileLinkHeaderAppender(client.release, client.release_data, i, convertAddrToBank)
|
||||||
outer.release <> rel_w_header
|
outer.release <> rel_w_header
|
||||||
outer.release_data <> rel_data_w_header
|
outer.release_data <> rel_data_w_header
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user