Chisel:When-otherwise 子句在函数定义中不起作用
Chisel : When-otherwise clause not working in function definition
我正在尝试使用 Chisel 3 开发一个简单的电路来生成数字 n 的阶乘。这是我的实现:
class Factorial extends Module{
val io = IO(new Bundle{
val input = Input(UInt(8.W))
val output = Output(UInt(16.W))
})
def factorial(n: UInt): UInt = {
when (n === 0.U) {1.U}
.otherwise {n*factorial(n-1.U)}
}
io.out := factorial(io.in)
}
但是,当我尝试 运行 它时,出现以下错误:
cmd26.sc:9: type mismatch;
found : Unit
required: chisel3.UInt
.otherwise {n*factorial(n-1.U)}
^Compilation Failed
这有什么特别的原因吗?我该如何解决这个问题?
此外,我意识到一个简单的解决方案是让数字 n 的类型为 Int
,并使用 if-else 子句代替。有什么方法可以对函数调用期间传递的参数进行类型转换(即从 chisel3.UInt
到 Int
)?
我认为你不能那样做。 when(){}.otherwise{} 是一种硬件构造,它没有 return 任何值(单位),因为我们 can see in code.
使用此构造,您想“即时”生成硬件,这是不可能的。
我想你已经像这样直接生成了所有的解决方案:
class Factorial extends Module{
val io = IO(new Bundle{
val input = Input(UInt(8.W))
val output = Output(UInt(1676.W))
})
def factorial(n: BigInt): BigInt = {
if(n == 0){
1
}else{
n*factorial(n-1)
}
}
io.output := 0.U
for(i <- 0 to 0xFF) {
when(io.input === i.U){
io.output := factorial(i).U
}
}
}
您可以保留递归 Scala 函数,但仅用于硬件生成步骤。
注意是255!是一个非常大的数字,您将需要超过 16 位 UInt 来输出该值 ;)
Chisel when
、elsewhen
和 otherwise
语句没有 return 值。
您的设计似乎是在尝试在单个周期内计算输入的阶乘值。这仅适用于小输入值,通过查找 table.
可能更容易实现
我认为您正在寻找的(这将是一个很好的学习练习)是构建一个电路,给定输入将 return 在一定数量的循环后的阶乘值。这与 GCD 示例的工作方式非常相似,GCD 作为示例包含在 the chisel-template repo 作为示例中。为此,您需要寄存器和准备就绪且有效的端口。
我建议你弄清楚它是如何工作的,你应该更容易地制作你的阶乘。祝你好运。正如@FabienM 所建议的那样,您将需要一个非常大的输出端口来包含即使是适度输入值的答案。
我正在尝试使用 Chisel 3 开发一个简单的电路来生成数字 n 的阶乘。这是我的实现:
class Factorial extends Module{
val io = IO(new Bundle{
val input = Input(UInt(8.W))
val output = Output(UInt(16.W))
})
def factorial(n: UInt): UInt = {
when (n === 0.U) {1.U}
.otherwise {n*factorial(n-1.U)}
}
io.out := factorial(io.in)
}
但是,当我尝试 运行 它时,出现以下错误:
cmd26.sc:9: type mismatch;
found : Unit
required: chisel3.UInt
.otherwise {n*factorial(n-1.U)}
^Compilation Failed
这有什么特别的原因吗?我该如何解决这个问题?
此外,我意识到一个简单的解决方案是让数字 n 的类型为 Int
,并使用 if-else 子句代替。有什么方法可以对函数调用期间传递的参数进行类型转换(即从 chisel3.UInt
到 Int
)?
我认为你不能那样做。 when(){}.otherwise{} 是一种硬件构造,它没有 return 任何值(单位),因为我们 can see in code.
使用此构造,您想“即时”生成硬件,这是不可能的。
我想你已经像这样直接生成了所有的解决方案:
class Factorial extends Module{
val io = IO(new Bundle{
val input = Input(UInt(8.W))
val output = Output(UInt(1676.W))
})
def factorial(n: BigInt): BigInt = {
if(n == 0){
1
}else{
n*factorial(n-1)
}
}
io.output := 0.U
for(i <- 0 to 0xFF) {
when(io.input === i.U){
io.output := factorial(i).U
}
}
}
您可以保留递归 Scala 函数,但仅用于硬件生成步骤。 注意是255!是一个非常大的数字,您将需要超过 16 位 UInt 来输出该值 ;)
Chisel when
、elsewhen
和 otherwise
语句没有 return 值。
您的设计似乎是在尝试在单个周期内计算输入的阶乘值。这仅适用于小输入值,通过查找 table.
我认为您正在寻找的(这将是一个很好的学习练习)是构建一个电路,给定输入将 return 在一定数量的循环后的阶乘值。这与 GCD 示例的工作方式非常相似,GCD 作为示例包含在 the chisel-template repo 作为示例中。为此,您需要寄存器和准备就绪且有效的端口。
我建议你弄清楚它是如何工作的,你应该更容易地制作你的阶乘。祝你好运。正如@FabienM 所建议的那样,您将需要一个非常大的输出端口来包含即使是适度输入值的答案。