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 要求所有与硬件相关的行为模型在本质上都能发挥作用。所以,我的问题有两个:
- 我是否总是需要使用函数式编程在 Chisel 中编写行为模型?
- 我可以创建一个实现上述功能的函数式 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 中使用函数式编程范式,但它绝对可以使您的代码更加优雅和可读。
我试图找到以下算法的功能等价物(不是真正的 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 要求所有与硬件相关的行为模型在本质上都能发挥作用。所以,我的问题有两个:
- 我是否总是需要使用函数式编程在 Chisel 中编写行为模型?
- 我可以创建一个实现上述功能的函数式 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 中使用函数式编程范式,但它绝对可以使您的代码更加优雅和可读。