0

我正在尝试更改系统中每个 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

在里面我只是尝试驱动时钟和电线SystemModuleSystem.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.clockwire.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 可以吗?

现在我被困住了。

在不修改火箭芯片凿子的情况下,最简洁、最干净的方法是什么?

谢谢!

4

1 回答 1

0

首先,不建议为每个 hart 使用不同的时钟。由于 L2 系统被设计为同步的。

你总是得到错误的原因attempted to instantiate a Module without wrapping it in Module()是你实际上连接了一些在LazyModule细化开始时没有实例化的电线。相反,您应该在LazyModuleImp.

我认为你可以这样做:

RocketSubsystemModuleImp

    with HasResetVectorWire
    with HasRocketTilesModuleImp {
  val harts_clock = IO(Vec($HARTS,Clock().asInput))
  val harts_reset = IO(Vec($HARTS, Bool().asInput))
  tile_inputs.zip(outer.hartIdList).foreach { case(wire, i) =>
    wire.clock := harts_clock(i)
    wire.reset := harts_reset(i)
    wire.wic_clock := wic_clock
    wire.hartid := UInt(i)
    wire.reset_vector := global_reset_vector
  }
}

TestHarness,你可以直接连接你的 harts_clock

dut.harts_clock(0) := clock

于 2019-10-24T03:19:39.963 回答