Scala 选项影响

问题描述

我在使用 scala in 命令时遇到问题。我想一直生成 .getorElse,但我只想要 AVecAVecBVec 时,最后,我希望当 {{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 视为具有恰好零个或一个元素的 ListArray。就像你可以mapforeach一个List(或chisel3 Vec,正如你在这里所做的那样),你可以mapforeach 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.foreachimplementation