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
,每个磁贴1个RocketTileParams
为我们提供了RocketCrossingKey
,每个磁贴1个或如果只有1个,则适用于所有磁贴RocketCrossingParams
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())[错误]^