Scala/Chisel 中的函数式 for 循环

Functional for loop in Scala/Chisel

我试图找到以下算法的功能等价物(不是真正的 Scala 或 Chisel 语法):

val x = Wire(Vec(n, UInt(L.W)))
val z = Wire(UInt(L.W))
var y = 0;
for (i <- 0 to (L-1)) {
   y = 0;
   for (j <- 0 to (n-1)) {
      y = y || x(j, i)
   }
   z(i) = y;
}

原题

我有 n 条总线,每条总线都有 L 条电线。我想创建一个 OR 门,它具有来自每条总线的相应位并产生输出。我知道的归约运算符在单总线上工作。例如,我可以使用 x(1).orR 创建一个或门,但我如何在总线数组上实现它。我假设 Chisel 要求所有与硬件相关的行为模型在本质上都能发挥作用。所以,我的问题有两个:

  1. 我是否总是需要使用函数式编程在 Chisel 中编写行为模型?
  2. 我可以创建一个实现上述功能的函数式 for 循环吗?

我不做 Chisel,所以我无法测试它,但我认为如果没有所有那些讨厌的可变变量,它也能做同样的事情。

(0 until L).foldLeft((Wire(Vec(n,UInt(L.W))), Wire(UInt(L.W)))){
  case ((x,z),i) =>
    z(i) = (0 until n).foldLeft(0){case (y,j) => y || x(j,i)}
}
z := x.reduce(_ | _)

或使用树减少以获得更有效的硬件描述:

io.z := io.x.reduceTree(_ | _)

在此处查看生成的 Verilog: https://scastie.scala-lang.org/kammoh/lxOjBBtXTJ69bqgYVClexw/2

Scala 是一种多范式编程语言,支持函数式、面向对象甚至命令式模型。您不必必须在 Chisel 中使用函数式编程范式,但它绝对可以使您的代码更加优雅和可读。