问题描述
我在使用 scala in
命令时遇到问题。我想一直生成 .getorElse
,但我只想要 AVec
和 AVec
当 BVec
时,最后,我希望当 {{1 }}。我已经尝试过 elemA >= 50
,但没有成功,您可以在下面看到 elemA >= 100
的实现。
任何关于如何正确实现这一点的建议将不胜感激。谢谢!
.get
解决方法
考虑到你写作的风格,为什么不这样做?
CVec.getOrElse(AVec).map{_.valid := false.B}
话虽如此,使用 Option
的方式还有更多。我建议在 Scala 中查看一些关于 Option
的教程,例如。 https://www.baeldung.com/scala/option-type
特别是,您并不总是需要“获取”Option
。将 Option
视为具有恰好零个或一个元素的 List
或 Array
。就像你可以map
或foreach
一个List
(或chisel3 Vec
,正如你在这里所做的那样),你可以map
或foreach
Option
。考虑以下几点:
when(io.elemB.fire()){
when(io.elemC === 0.U){
// Note that I used () instead of {},this is a stylistic choice
// Generally you use {} only when there are multiple Statements in the anonymous function
// If this doesn't make sense to you yet,just ignore it,it's fine to use {} :)
AVec.map(_.valid := false.B)
}.elsewhen(io.elemC === 1.U){
AVec.map(_.valid := false.B)
BVec.foreach(_.map(_.valid := false.B))
}.otherwise{
AVec.map(_.valid := false.B)
BVec.foreach(_.map(_.valid := false.B))
CVec.foreach(_.map(_.valid := false.B))
}
就像 AVec.map(f)
将 f
应用于 Vec
的每个元素一样,BVec.foreach(g)
将 g
应用于 BVec
的内容,如果它是Some
,或者什么都不做。这是 2 层函数嵌套深度,当您不熟悉 Chisel/Scala 时,这可能看起来有点陌生,但这是表达这一点的常用方法。
或者,您可以测试选项并使用 .get
,这对于刚接触函数式编程的人(即大多数刚接触 Chisel 的人)来说通常更熟悉:
when(io.elemB.fire()){
when(io.elemC === 0.U){
AVec.map(_.valid := false.B)
}.elsewhen(io.elemC === 1.U){
AVec.map(_.valid := false.B)
if (BVec.isDefined) {
BVec.get.map(_.valid := false.B)
}
}.otherwise{
AVec.map(_.valid := false.B)
if (BVec.isDefined) {
BVec.get.map(_.valid := false.B)
}
if (CVec.isDefined) {
CVec.get.map(_.valid := false.B)
}
}
如果这看起来有点冗长(您必须写 CVec
两次),这就是 foreach
的用途。这个“如果定义,做 .get
并做某事”字面上是 Option.foreach
的 implementation。