我正在尝试更改系统中每个 Rocket 瓷砖的时钟和重置。
目前我正在尝试这样做。在 Platform.scala 中,我在 PlatformIO 中声明了一些输入(其中 $HARTS 是我们的 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然后吐槽说我的方向错了?
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 可以吗?
现在我被困住了。
在不修改火箭芯片凿子的情况下,最简洁、最干净的方法是什么?
谢谢!