我正在尝试使用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
)?
答案 0 :(得分:2)
我认为您不能这样做。 when(){}。otherwise {}是一种硬件构造,不会像我们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才能输出值;)
答案 1 :(得分:2)
凿子when
,elsewhen
和otherwise
语句不返回值。
您的设计似乎是尝试在单个周期内计算输入的阶乘值。这仅适用于较小的输入值,并且可能更容易通过查找表实现。
我认为您正在寻找的东西(这是一个很好的学习练习)是建立一个电路,给定输入将在一定数量的循环后返回阶乘值。这与GCD示例的工作方式非常相似,the chisel-template repo中包含GCD作为示例。为此,您将需要寄存器以及就绪和有效的端口。
我建议您弄清楚它是如何工作的,并且您应该有更多的时间来进行阶乘。祝好运。而且,正如@FabienM所建议的那样,您将需要一个非常大的输出端口来包含即使是中等输入值的答案。