我正在尝试实现火箭芯片SoC设计;默认情况下,SoC设计将生成一个AXI内存端口。但是我想使用AHB内存端口,而火箭芯片对此没有任何信任。有人已经这么做了吗?
谢谢
发布于 2022-03-23 04:45:48
与subsystem/Ports.scala中的subsystem/Ports.scala类似,一般的思想是实例化AHBSinkNode并通过TLToAHB小部件连接到它。
trait CanHaveAhbMemPort { this: BaseSubsystem =>
private val memPortParamsOpt = p(AhbExtMem) // could also add a parameter to switch between axi/ahb
private val portName = "ahb"
private val device = new MemoryDevice
private val idBits = memPortParamsOpt.map(_.master.idBits).getOrElse(1)
val memAhbNode = AHBSlaveSinkNode( memPortParamsOpt.map({ case MemoryPortParams(memPortParams, nMemoryChannels) =>
Seq.tabulate(nMemoryChannels) { channel =>
val base = AddressSet.misaligned(memPortParams.base, memPortParams.size)
val filter = AddressSet(channel * mbus.blockBytes, ~((nMemoryChannels-1) * mbus.blockBytes))
AHBSlavePortParameters(
Seq(AHBSlaveParameters(
address = base.flatMap(_.intersect(filter)),
resources = device.reg,
regionType = RegionType.UNCACHED
executable = executable,
supportsRead = TransferSizes(1, memPortParams.beatBytes * AHBParameters.maxTransfer),
supportsWrite = TransferSizes(1, memPortParams.beatBytes * AHBParameters.maxTransfer))),
beatBytes = memPortParams.beatBytes,
lite = false)
}
}).toList.flatten)
mbus.coupleTo(s"memory_controller_port_named_$portName") {
(memAhbNode
:*= TLToAHB()
:*= TLWidthWidget(mbus.beatBytes)
:*= _)
} Note:我还没有测试过这个。这有望说明如何用AHB交换mem端口的一般想法。就参数和小部件的使用而言,可能需要进行一些实验。希望未来的答案或编辑这个答案能够反映任何测试的结果或经验与此转换。
https://stackoverflow.com/questions/70915823
复制相似问题