将 MMIO 外设添加到小型火箭核心
Adding a MMIO peripheral to a small rocket core
我之前已经成功地添加并模拟了我的 MMIO 外设耦合到一个正常大小的火箭核心。
但现在我想尝试将它添加到一个小核心(所谓的 TinyCore),这是我遇到问题的部分。另外,为了以防万一,与我的外围设备的连接都是通过 FIFO 进行的。
首先,我在尝试生成设计时遇到的错误:
[error] java.lang.IllegalArgumentException: requirement failed: Ports cannot overlap: AddressSet(0x80000000, 0x3fff) AddressSet(0x80000000, 0xfffffff)
我想这是因为小火箭配置有一个不同的内存映射,我不知道,我正在尝试将外围设备添加到该配置中不存在的地址。
这是我使用的配置:
class myTinyRocketConfig2 extends Config(
new freechips.rocketchip.subsystem.WithInclusiveCache(nBanks=1, nWays=4, capacityKB=128) ++
new freechips.rocketchip.subsystem.With1TinyCore ++ // single tiny rocket-core
new chipyard.config.AbstractConfig)
这就是我添加外围设备的方式,它显示了地址和一些其他参数:
class TLTxWriteQueue
(
depth: Int = 4,
csrAddress: AddressSet = AddressSet(0x2000, 0xff),
beatBytes: Int = 4,
)(implicit p: Parameters) extends TxWriteQueue(depth) with TLHasCSR {
val devname = "tlQueueIn"
val devcompat = Seq("ucb-art", "dsptools")
val device = new SimpleDevice(devname, devcompat) {
override def describe(resources: ResourceBindings): Description = {
val Description(name, mapping) = super.describe(resources)
Description(name, mapping)
}
}
// make diplomatic TL node for regmap
override val mem = Some(TLRegisterNode(address = Seq(csrAddress), device = device, beatBytes = beatBytes))
}
对于任何愚蠢的错误,我提前表示歉意,因为我是一个试图完成他的第一个项目的初学者。谢谢
Rocket TinyCore 使用默认暂存器而不是后备存储器。此暂存器 0x80000000
到 0x80003fff
与 memport 的地址范围重叠。
您必须删除内存。这就是 chipyard 的 TinyRocketConfig
所做的。此配置应生成一个设计(只是没有 L2 缓存或后备内存)。
class TinyRocketConfig extends Config(
new chipyard.config.WithTLSerialLocation(
freechips.rocketchip.subsystem.FBUS,
freechips.rocketchip.subsystem.PBUS) ++ // attach TL serial adapter to f/p busses
new chipyard.WithMulticlockIncoherentBusTopology ++ // use incoherent bus topology
new freechips.rocketchip.subsystem.WithNBanks(0) ++ // remove L2$
new freechips.rocketchip.subsystem.WithNoMemPort ++ // remove backing memory
new freechips.rocketchip.subsystem.With1TinyCore ++ // single tiny rocket-core
new chipyard.config.AbstractConfig)
如果您想在设计中包含 InclusiveCache,您可以尝试使用 chipyard TinyRocketConfig
的修改版本。尽管目前,您似乎并没有在处理整个 L2 缓存,而且我认为它在微架构上未与 TinyCore 一起使用。如果您只是需要更大的暂存器,您可以修改暂存器以包含更多集:
class WithModifiedScratchPad extends Config((site, here, up) => {
case RocketTilesKey => up(RocketTilesKey, site) map { r =>
// each set is currently 64 bits
r.copy(dcache = r.dcache.map(_.copy(nSets = 2048 /*128kb scratchpad*/))) }
})
我之前已经成功地添加并模拟了我的 MMIO 外设耦合到一个正常大小的火箭核心。 但现在我想尝试将它添加到一个小核心(所谓的 TinyCore),这是我遇到问题的部分。另外,为了以防万一,与我的外围设备的连接都是通过 FIFO 进行的。
首先,我在尝试生成设计时遇到的错误:
[error] java.lang.IllegalArgumentException: requirement failed: Ports cannot overlap: AddressSet(0x80000000, 0x3fff) AddressSet(0x80000000, 0xfffffff)
我想这是因为小火箭配置有一个不同的内存映射,我不知道,我正在尝试将外围设备添加到该配置中不存在的地址。
这是我使用的配置:
class myTinyRocketConfig2 extends Config(
new freechips.rocketchip.subsystem.WithInclusiveCache(nBanks=1, nWays=4, capacityKB=128) ++
new freechips.rocketchip.subsystem.With1TinyCore ++ // single tiny rocket-core
new chipyard.config.AbstractConfig)
这就是我添加外围设备的方式,它显示了地址和一些其他参数:
class TLTxWriteQueue
(
depth: Int = 4,
csrAddress: AddressSet = AddressSet(0x2000, 0xff),
beatBytes: Int = 4,
)(implicit p: Parameters) extends TxWriteQueue(depth) with TLHasCSR {
val devname = "tlQueueIn"
val devcompat = Seq("ucb-art", "dsptools")
val device = new SimpleDevice(devname, devcompat) {
override def describe(resources: ResourceBindings): Description = {
val Description(name, mapping) = super.describe(resources)
Description(name, mapping)
}
}
// make diplomatic TL node for regmap
override val mem = Some(TLRegisterNode(address = Seq(csrAddress), device = device, beatBytes = beatBytes))
}
对于任何愚蠢的错误,我提前表示歉意,因为我是一个试图完成他的第一个项目的初学者。谢谢
Rocket TinyCore 使用默认暂存器而不是后备存储器。此暂存器 0x80000000
到 0x80003fff
与 memport 的地址范围重叠。
您必须删除内存。这就是 chipyard 的 TinyRocketConfig
所做的。此配置应生成一个设计(只是没有 L2 缓存或后备内存)。
class TinyRocketConfig extends Config(
new chipyard.config.WithTLSerialLocation(
freechips.rocketchip.subsystem.FBUS,
freechips.rocketchip.subsystem.PBUS) ++ // attach TL serial adapter to f/p busses
new chipyard.WithMulticlockIncoherentBusTopology ++ // use incoherent bus topology
new freechips.rocketchip.subsystem.WithNBanks(0) ++ // remove L2$
new freechips.rocketchip.subsystem.WithNoMemPort ++ // remove backing memory
new freechips.rocketchip.subsystem.With1TinyCore ++ // single tiny rocket-core
new chipyard.config.AbstractConfig)
如果您想在设计中包含 InclusiveCache,您可以尝试使用 chipyard TinyRocketConfig
的修改版本。尽管目前,您似乎并没有在处理整个 L2 缓存,而且我认为它在微架构上未与 TinyCore 一起使用。如果您只是需要更大的暂存器,您可以修改暂存器以包含更多集:
class WithModifiedScratchPad extends Config((site, here, up) => {
case RocketTilesKey => up(RocketTilesKey, site) map { r =>
// each set is currently 64 bits
r.copy(dcache = r.dcache.map(_.copy(nSets = 2048 /*128kb scratchpad*/))) }
})