Как подключить порт AHB к устройству контроллера DRAM с помощью Diplomacy - PullRequest
2 голосов
/ 09 октября 2019

Как подключить 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.

1 Ответ

3 голосов
/ 29 октября 2019

Попробуйте:

          memAHBNode := mbus.toDRAMController(Some(portName)) { TLToAHB() }

Вы сделали это слишком сложно. : -)

Вам также не следует устанавливать поля nodePath или device в AHBSlavePortParamters. Я искренне шокирован тем, что device существует, и его следует удалить как можно скорее.

...