Я пытаюсь изменить часы и перезагрузки, которые идут на каждую плитку Ракеты в моей системе.
В данный момент я пытаюсь сделать это следующим образом.В 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 будет в порядке?
А теперь я застрял.
Что было бы самым чистым и чистым способом сделать это без измененияв ракете-чипе?
Спасибо!