Изменение тактирования в RocketSubsystemModuleImp из System.scala - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь изменить часы и перезагрузки, которые идут на каждую плитку Ракеты в моей системе.

В данный момент я пытаюсь сделать это следующим образом.В Platform.scala у меня есть некоторые входные данные, объявленные в моем PlatformIO (где $ HARTS - это наше количество хартов):

val hart_clocks = Vec($HARTS,Bool(INPUT))
val hart_resets = Vec($HARTS,Bool(INPUT))

В System.scala у меня есть:

val hart_clocks = IO(Vec($HARTS,Bool(INPUT)))
val hart_resets = IO(Vec($HARTS,Bool(INPUT)))

и вPlatform.scala У меня есть это:

sys.hart_clocks := io.internals.hart_clocks
sys.hart_resets := io.internals.hart_resets

Теперь хитрый момент - взаимодействие между парнем SystemModule ... extends RocketSubsystemModuleImp(_outer) и классом RocketSubsystemModuleImp.

В RocketSubsystemModuleImp у нас изначально есть это:

class RocketSubsystemModuleImp[+L <: RocketSubsystem](_outer: L) extends BaseSubsystemModuleImp(_outer)
    with HasRocketTilesModuleImp {
  tile_inputs.zip(outer.hartIdList).foreach { case(wire, i) =>
    wire.clock := clock
    wire.reset := reset
    wire.hartid := UInt(i)
    wire.reset_vector := global_reset_vector
  }
} 

Все хорошо - я выбрал эту точку для переопределения часов и сброса, потому что это хорошая точка иерархически (на краю плитки) и в коде, с готовыми назначениями часов и сброса.быть измененным.

Однако я до сих пор не мог заставить что-либо работать.Вот различные вещи, которые я пробовал, и ошибки, которые я получил:

Попытка 1

В SystemModule в System.scala Я просто пытаюсь управлять часами и проводами:

  _outer.module.tile_inputs(0).clock := hart_clocks(0)
  _outer.module.tile_inputs(1).clock := hart_clocks(1)
  ...
  _outer.module.tile_inputs(2).clock := hart_clocks($HARTS)

  _outer.module.tile_inputs(0).reset := hart_resets(0)
  _outer.module.tile_inputs(1).reset := hart_resets(1)
  ...
  _outer.module.tile_inputs(1).reset := hart_resets($HARTS)

Уродливо и еще много чего, но это была первая попытка.

Я, очевидно, также прокомментировал назначения проводов в RocketSubsystemModuleImp:

  tile_inputs.zip(outer.hartIdList).foreach { case(wire, i) =>
    //wire.clock := clock
    //wire.reset := reset
    wire.hartid := UInt(i)
    wire.reset_vector := global_reset_vector
  }

Это скомпилировано, но взрываетсяподробно с этой ошибкой:

[error] Caused by: chisel3.internal.ChiselException: Error: attempted to instantiate a Module without wrapping it in Module().
[error]         at chisel3.internal.throwException$.apply(Error.scala:44)
[error]         at chisel3.core.BaseModule.<init>(Module.scala:126)
[error]         at chisel3.core.UserModule.<init>(UserModule.scala:18)
[error]         at chisel3.core.ImplicitModule.<init>(UserModule.scala:121)
[error]         at freechips.rocketchip.diplomacy.LazyModuleImp.<init>(LazyModule.scala:185)
[error]         at freechips.rocketchip.subsystem.BareSubsystemModuleImp.<init>(BaseSubsystem.scala:20)
[error]         at freechips.rocketchip.subsystem.BaseSubsystemModuleImp.<init>(BaseSubsystem.scala:101)
[error]         at freechips.rocketchip.subsystem.RocketSubsystemModuleImp.<init>(RocketSubsystem.scala:69)

Попытка 2

Объявите некоторые промежуточные переменные в class RocketSubsystemModuleImp:

class RocketSubsystemModuleImp[+L <: RocketSubsystem](_outer: L) extends BaseSubsystemModuleImp(_outer)
    with HasRocketTilesModuleImp {
  val hart_clocks_wire = Wire(Vec($HARTS,Bool()))
  val hart_resets_wire = Wire(Vec($HARTS,Bool()))
  tile_inputs.zip(outer.hartIdList).foreach { case(wire, i) =>
    wire.clock := hart_clocks_wire(i).asClock()
    wire.reset := hart_resets_wire(i)
    wire.hartid := UInt(i)
    wire.reset_vector := global_reset_vector
  }
}

, а затем в SystemModule:

  val hart_clocks = IO(Vec($HARTS,Bool(INPUT)))
  val hart_resets = IO(Vec($HARTS,Bool(INPUT)))

  _outer.module.hart_clocks_wire := hart_clocks
  _outer.module.hart_resets_wire := hart_resets

Однако это также вызывает то же самое неодобрение со стороны инструментов:

[error] Caused by: chisel3.internal.ChiselException: Error: attempted to instantiate a Module without wrapping it in Module().
[error]         at chisel3.internal.throwException$.apply(Error.scala:44)
[error]         at chisel3.core.BaseModule.<init>(Module.scala:126)
[error]         at chisel3.core.UserModule.<init>(UserModule.scala:18)
[error]         at chisel3.core.ImplicitModule.<init>(UserModule.scala:121)
[error]         at freechips.rocketchip.diplomacy.LazyModuleImp.<init>(LazyModule.scala:185)
[error]         at freechips.rocketchip.subsystem.BareSubsystemModuleImp.<init>(BaseSubsystem.scala:20)
[error]         at freechips.rocketchip.subsystem.BaseSubsystemModuleImp.<init>(BaseSubsystem.scala:101)
[error]         at freechips.rocketchip.subsystem.RocketSubsystemModuleImp.<init>(RocketSubsystem.scala:69)

Попытка 3

Вместо попытки переопределить его в ModuleImp, я затем попытался управлять имкак в System.scala:

  _outer.tiles(0).module.clock := hart_clocks(0).asClock()
  _outer.tiles(0).module.reset := hart_resets(0)

и закомментировав назначения wire.clock и wire.reset в RocketSubsystemModuleImp ...

... как бы там ни говорилимои указания были неверны?

firrtl.passes.CheckGenders$WrongGender:  @[Platform.scala 283:19:Config.fir@540640.4]: [module Platform]  Expression sys.hart_clocks is used as a FEMALE but can only be used as a MALE.
firrtl.passes.CheckGenders$WrongGender:  @[Platform.scala 284:19:Config.fir@540641.4]: [module Platform]  Expression sys.hart_resets is used as a FEMALE but can only be used as a MALE.

Хммм?Я бы подумал, что Input -> Input -> Input будет в порядке?

А теперь я застрял.

Что было бы самым чистым и чистым способом сделать это без измененияв ракете-чипе?

Спасибо!

...