Chisel 如何使单个火箭平铺与系统的其余部分异步

Chisel 如何使单个火箭平铺与系统的其余部分异步,chisel,rocket-chip,Chisel,Rocket Chip,我有一个多核火箭芯片系统。但是,我希望其中一个火箭图块与其他图块是异步的 我们正试图通过以下方式做到这一点: class WithTilesCrossing extends Config((site, here, up) => { case RocketCrossingKey => site(RocketTilesKey).head.hartId match { case 2 => up(RocketCrossingKey) map { r =>

我有一个多核火箭芯片系统。但是,我希望其中一个火箭图块与其他图块是异步的

我们正试图通过以下方式做到这一点:

class WithTilesCrossing extends Config((site, here, up) => {
  case RocketCrossingKey => site(RocketTilesKey).head.hartId match {
    case 2 => up(RocketCrossingKey) map { r =>
      r.copy(crossingType = AsynchronousCrossing(),
             master = TileMasterPortParams())}
    case _ => up(RocketCrossingKey) map { r =>
      r.copy(crossingType = SynchronousCrossing(BufferParams(1)),
             master = TileMasterPortParams())}
  }
})
因此,具有
hartId=2
的hart应该是异步的,其余的应该是同步的

上述内容添加到我们的配置中时,似乎没有任何作用

但是,如果我在
src/main/scala/subsystem/Config.scala
中将
与AsynchronousRockettiles
一起使用,那么我会将所有磁贴转换为async

那么,我该怎么做一块瓷砖呢

根据Jack的建议更新:

直接尝试该代码可以:

[error] Config.scala:189:16: not found: value crossingType
[error]         r.copy(crossingType = AsynchronousCrossing(),
[error]                ^
[error] Config.scala:190:11: not found: value master
[error]           master = TileMasterPortParams())
[error]           ^
[error] Config.scala:192:16: not found: value crossingType
[error]         r.copy(crossingType = SynchronousCrossing(BufferParams(1)),
[error]                ^
[error] Config.scala:193:11: not found: value master
[error]           master = TileMasterPortParams())
[error]           ^
[error] four errors found
这是令人惊讶的。所以我想我可能需要做
up()
的事情,并尝试了以下方法:

  case RocketCrossingKey => site(RocketTilesKey).map { r =>
    r.hartId match {
      case 2 => up(RocketCrossingKey) map { k => k.copy(crossingType = AsynchronousCrossing(), master = TileMasterPortParams()) }
      case _ => up(RocketCrossingKey) map { k => k.copy(crossingType = SynchronousCrossing(BufferParams(1)), master = TileMasterPortParams()) }
    }
  }
但是,这会导致elab错误:

[error] Caused by: java.lang.ClassCastException: scala.collection.immutable.$colon$colon cannot be cast to freechips.rocketchip.subsystem.RocketCrossingParams
[error]         at freechips.rocketchip.subsystem.HasRocketTiles.$anonfun$rocketTiles$1(RocketSubsystem.scala:41)
[error]         at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:234)
[error]         at scala.collection.immutable.List.foreach(List.scala:389)
[error]         at scala.collection.TraversableLike.map(TraversableLike.scala:234)
[error]         at scala.collection.TraversableLike.map$(TraversableLike.scala:227)
[error]         at scala.collection.immutable.List.map(List.scala:295)
[error]         at freechips.rocketchip.subsystem.HasRocketTiles.$init$(RocketSubsystem.scala:41)
[error]         at freechips.rocketchip.subsystem.RocketSubsystem.<init>(RocketSubsystem.scala:70)
[错误]由以下原因引起:java.lang.ClassCastException:scala.collection.immutable.$colon$colon无法强制转换为freechips.rocketchip.subsystem.RocketCrossingParams
[错误]位于freechips.rocketchip.subsystem.HasRocketTiles.$anonfun$rocketTiles$1(RocketSubsystem.scala:41)
scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:234)处的[error]
scala.collection.immutable.List.foreach(List.scala:389)处的[error]
scala.collection.TraversableLike.map(TraversableLike.scala:234)处的[error]
scala.collection.TraversableLike.map$(TraversableLike.scala:227)处的[错误]
scala.collection.immutable.List.map(List.scala:295)处的[error]
[错误]位于freechips.rocketchip.subsystem.HasRocketTiles.$init$(RocketSubsystem.scala:41)
[错误]位于freechips.rocketchip.subsystem.RocketSubsystem.(RocketSubsystem.scala:70)
因此,仍然坚持如何修改原始的
RocketCrossingParams
并返回它。

查看

case对象RocketCrossingKey扩展字段[Seq[RocketCrossingParams]](列表(RocketCrossingParams())
您会注意到类型是
Seq[RocketCrossingParams]
。这意味着(尽管我可能错了),我们每个磁贴有1个
RocketCrossingParams
。在您的代码片段中,您只需查看此
Seq
(通过
.head
)中的第一个,检查它的
hartId
是否等于2,若等于2,则迭代所有
RocketCrossingKey
并将其设置为
异步交叉

尝试下面的方法,在这里我们对它们进行迭代,并且只将其中一个的索引替换为
hartId==2

case RocketCrossingKey=>site(RocketTilesKey).map{r=>
如果(r.hartId==2){//,或者您可以在它上面匹配,不管怎样
r、 复制(crossingType=AsynchronousCrossing(),
master=TileMasterPortParams())
}否则{
r、 复制(crossingType=SynchronousCrossing(缓冲参数(1)),
master=TileMasterPortParams())
}
}
编辑:我忽略了一个事实,即既有
RocketCrossingKey
也有
RocketLessKey

所以这里的问题是有两个平行的
Seq
s参数:

  • RocketTilesKey
    为我们提供了
    RocketTileParams
    ,每个磁贴1个
  • RocketCrossingKey
    为我们提供了
    RocketCrossingParams
    ,每个磁贴1个如果只有1个,则适用于所有磁贴
也可能没有
RocketTileParams
包含
hartId==2
,因此让我们适当地处理所有问题:

case RocketCrossingKey=>
val tileParams=场地(RocketTilesKey)
val crossingParams=站点(RocketCrossingKey)
//人们可能会假设Hartid2==索引2,但情况可能并非如此
//此外,甚至可能没有hartId==2的磁贴
val indexOfHartId2:选项[Int]=
tileParams.zipWithIndex.collectFirst{如果r.hartId==2=>idx}
INDEXOFHARTD2.map{idx=>
//这与HasTiles.perTileOrGlobalSetting中的逻辑重复
//如果只有1个,则适用于所有
val crossings=场地(RocketCrossingKey)匹配{
案例序号(一)=>列表填充(图幅大小)(一)
case many=>many
}
//使用hartId==2的适当索引返回原始答案
crossings.zipWithIndex.map{案例(c,i)=>
如果(i==idx){//,或者您可以在它上面匹配,不管怎样
c、 复制(crossingType=AsynchronousCrossing(),
master=TileMasterPortParams())
}否则{
c、 复制(crossingType=SynchronousCrossing(缓冲参数(1)),
master=TileMasterPortParams())
}
}
}.getOrElse(crossingParams)//如果我们甚至没有hardId==2,则返回原始值

啊,这很有道理,非常感谢!然而,我的Scala/凿子技能无法将您的建议转化为有效的建议。按原样尝试代码时会说找不到
crossingType
master
??(很抱歉,这些评论中stackoverflow糟糕的格式规则弄乱了以下内容:-/)
[error]Config.scala:189:16:找不到:value-crossingType[error]r.copy(crossingType=AsynchronousCrossing(),[error]^[error]Config.scala:190:11:找不到:value-master[error]master=TileMasterPortParams())[错误]^