问题描述
我正在尝试设计以下由 Fulladers 制成的 Ripple Carry Adder。到目前为止,我尝试了很多,但我在使用 Chisel Syntax 时遇到了困难。有人可以帮助我并指出我做错了什么吗?这是我的代码如下:
class RcaAdder(val n:Int) extends Module {
val io = IO(new Bundle {
val a = Input(UInt(n.W))
val b = Input(UInt(n.W))
val cin = Input(UInt(1.W))
val sum = Output(UInt(n.W))
val cout = Output(UInt(1.W))
})
//For loop
for(i <- 0 to n){
val fulladder = Module(new FullAdder())
fulladder.io.a := io.a(i)
fulladder.io.b := io.b(i)
if(i == 0){
fulladder.io.cin := io.cin
}else{
fulladder.io.cin := io.cout
}
io.cout := fulladder.io.cout
io.sum(i) := fulladder.io.sum
}
}
这让我出现以下错误:
Exception in thread "main" chisel3.internal.ChiselException: Cannot reassign to read-only Bool(OpResult in RcaAdder)
我认为它与“ io.sum(i) := .. ”有关
请帮帮我!非常感谢!
解决方法
您已经非常接近让它发挥作用了。您遇到的一个问题是您无法分配给 :=
左侧的位子集。解决此问题的一种方法是创建 Vec
的 UInt(1.W)
,然后将其用作 RHS 作为单个分配。我认为您的 if
有问题,我建议使用 foldLeft 而不是 for
,因为它提供了一种访问先前元素的机制。把这些放在一起,我想你想要的是这样的。
class RcaAdder(n: Int) extends Module {
val io = IO(new Bundle {
val a = Input(UInt(n.W))
val b = Input(UInt(n.W))
val cin = Input(UInt(1.W))
val sum = Output(UInt(n.W))
val cout = Output(UInt(1.W))
})
val outBits = Wire(Vec(n,UInt(1.W)))
io.cout := (0 until n).foldLeft(io.cin) { case (carry,index) =>
val fullAdder = Module(new FullAdder)
fullAdder.io.a := io.a(index)
fullAdder.io.b := io.b(index)
fullAdder.io.cin := carry
outBits(index) := fullAdder.io.sum
fullAdder.io.cout. // This will be passed as carry to the next interation
}
io.sum := outBits.asUInt()
}
我添加了一个有效的测试示例 here on scastie。 祝你好运,欢迎来到 Chisel