Как подключить Rocket-Chip к внешнему подчиненному порту AHB (т. Е. К порту AHB на контроллере памяти)? Я попытался создать шаблон своего кода после нескольких других примеров, которые подключались к ведомому устройству AXI4, и это работает нормально. Однако, когда я пытаюсь реализовать тот же подход, :=
подсвечивается красными волнистыми буквами в IntelliJ, что говорит мне, что он не может соединить эти два типа узлов или что классы не совместимы для операции связывания. Мне кажется, что я упускаю некоторые важные понятия об этих типах узлов, которые касаются того, как склеивать эти устройства.
trait CanHaveDdr4Ahb extends LazyModule { this: BaseSubsystem =>
import freechips.rocketchip.subsystem.ExtMem
override val module: CanHaveDdr4AhbImp
val ahb_mem = p(ExtMem).map {
case MemoryPortParams(mpp, nChan) => {
val portName = "my_ahb"
val device = new MemoryDevice
val memAHBNode = AHBSlaveSinkNode(Seq.tabulate(nChan) { channel =>
val base = AddressSet.misaligned(mpp.base, mpp.size)
val filter = AddressSet(channel * mbus.blockBytes, ~((nChan - 1) * mbus.blockBytes))
AHBSlavePortParameters(
slaves = Seq(AHBSlaveParameters(
address = List(AddressSet(mpp.base, mpp.size - 1)),
resources = device.reg,
regionType = RegionType.UNCACHED,
executable = true,
supportsWrite = TransferSizes(1, mbus.blockBytes),
supportsRead = TransferSizes(1, mbus.blockBytes))),
beatBytes = mpp.beatBytes)
})
// TODO: Why can't I assign DRAMController output to this AHBSlaveSinkNode?
// AHBSlaveSinkNode := OutwardNodeHandle[D,U,E,B] { body }
memAHBNode := mbus.toDRAMController(Some(portName)) { TLToAHB() }
memAHBNode
}
}
Редактировать: Хорошо, после того, как база кода сработалаобратно в Chipyard и используя данные решения, а именно: удаление присваивания nodePath и устройства в AHBSlaveParameters и изменение оператора: = binding на:
memAHBNode := mbus.toDRAMController(Some(portName)) { TLToAHB() }
... сохраняется тот же тип ошибки, что-то, что имеет делос тем, как операция связывания пытается связать что-то с левой стороны с помощью:
OutwardNodeHandle[
AHBMasterPortParameters,
AHBSlavePortParameters,
AHBEdgeParameters,
AHBMasterBundle] // <-- should be AHBSlaveBundle according to ahb/Nodes.scala
Обратите внимание, что в последней строке она пытается сопоставить
OutwardNodeHandle[D,U,E,AHBSlaveBundle]
наRHS с выводом
OutwardNodeHandle[D,U,E,AHBMasterBundle]
на LHS задания. Я не знаю, почему компилятор так печатает. Ниже выводится ошибка, которую я получаю. Я также обновил код выше.
[error] /home/abryant/workspace/chipyard/generators/socta1_rtl/src/main/scala/devices/Ddr4Ahb.scala:62:16: overloaded method value := with alternatives:
[error] [EY](h: freechips.rocketchip.diplomacy.OutwardNodeHandle[freechips.rocketchip.amba.ahb.AHBMasterPortParameters,freechips.rocketchip.amba.ahb.AHBSlavePortParameters,EY,freechips.rocketchip.amba.ahb.AHBSlaveBundle])(implicit p: freechips.rocketchip.config.Parameters, implicit sourceInfo: chisel3.internal.sourceinfo.SourceInfo)freechips.rocketchip.diplomacy.OutwardNodeHandle[freechips.rocketchip.amba.ahb.AHBMasterPortParameters,freechips.rocketchip.amba.ahb.AHBSlavePortParameters,freechips.rocketchip.amba.ahb.AHBEdgeParameters,freechips.rocketchip.amba.ahb.AHBSlaveBundle] <and>
[error] [DX, UX, EX, BX <: Chisel.Data, EY](h: freechips.rocketchip.diplomacy.NodeHandle[DX,UX,EX,BX,freechips.rocketchip.amba.ahb.AHBMasterPortParameters,freechips.rocketchip.amba.ahb.AHBSlavePortParameters,EY,freechips.rocketchip.amba.ahb.AHBSlaveBundle])(implicit p: freechips.rocketchip.config.Parameters, implicit sourceInfo: chisel3.internal.sourceinfo.SourceInfo)freechips.rocketchip.diplomacy.NodeHandle[DX,UX,EX,BX,freechips.rocketchip.amba.ahb.AHBMasterPortParameters,freechips.rocketchip.amba.ahb.AHBSlavePortParameters,freechips.rocketchip.amba.ahb.AHBEdgeParameters,freechips.rocketchip.amba.ahb.AHBSlaveBundle]
[error] cannot be applied to (freechips.rocketchip.diplomacy.OutwardNodeHandle[freechips.rocketchip.amba.ahb.AHBMasterPortParameters,freechips.rocketchip.amba.ahb.AHBSlavePortParameters,freechips.rocketchip.amba.ahb.AHBEdgeParameters,freechips.rocketchip.amba.ahb.AHBMasterBundle])
[error] memAHBNode := mbus.toDRAMController(Some(portName)) {
[error] ^
OutwardNodeHandle, который mbus.toDRAMController передает в: =, наследуется от типов AXI4Slave, но не от типов AHBSlave.