Scala/Chisel 连接的数据必须是硬件,不是裸凿类型
Scala/Chisel Data to be connected must be hardware, not a bare Chisel type
我正在尝试设计以下由 Fulladers 制成的 Ripple Carry Adder。到目前为止,我尝试了很多,但我正在为 Chisel 语法而苦苦挣扎。有人可以帮我指出我做错了什么吗?这是我的代码:
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))
})
//Create FullAdders
val fadder = Seq.tabulate(n) {
x => Module(new FullAdder())
}
//Setup
val summ = chisel3.Vec(n, Bool())
val carry = chisel3.Vec(n+1, UInt(1.W))
carry(0) := io.cin
//Do the wiring
for(inx <- 0 to n){
fadder(inx).io.a := io.a(inx)
fadder(inx).io.b := io.b(inx)
fadder(inx).io.cin := io.cin
carry(inx+1) := fadder(inx).io.cout
summ(inx) := fadder(inx).io.sum
}
io.sum := summ.asUInt()
io.cout := carry(n+1)
}
这是错误:
data to be connected 'UInt<1>' must be hardware, not a bare Chisel type
at rca.RcaAdder.<init>(RcaAdder.scala:40)
RcaAdder.scala:40
尝试在 Wire() 或 IO() 中包装进位或求和,但这没有帮助。 :(
有什么想法吗?真的在这里挣扎。
|史蒂夫 |关于必须使用 Wire wrapper 的说法是正确的,但还有其他一些错误。
- 将
Wire
包装器添加到 summ
和 carry
- 你的 for 语句应该使用
until
而不是 to
- 应该是
io.cout := carry(n)
而不是n+1
下面的代码应该可以工作。
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))
})
//Create FullAdders
val fadder = Seq.tabulate(n) {
x => Module(new FullAdder())
}
//Setup
val summ = Wire(chisel3.Vec(n, Bool()))
val carry = Wire(chisel3.Vec(n+1, UInt(1.W)))
carry(0) := io.cin
//Do the wiring
for(inx <- 0 until n){
fadder(inx).io.a := io.a(inx)
fadder(inx).io.b := io.b(inx)
fadder(inx).io.cin := io.cin
carry(inx+1) := fadder(inx).io.cout
summ(inx) := fadder(inx).io.sum
}
io.sum := summ.asUInt()
io.cout := carry(n)
}
这里的问题是使用 foldLeft
而不是 for
IMO 的好例子,因为它减少了出现索引错误的机会。
我正在尝试设计以下由 Fulladers 制成的 Ripple Carry Adder。到目前为止,我尝试了很多,但我正在为 Chisel 语法而苦苦挣扎。有人可以帮我指出我做错了什么吗?这是我的代码:
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))
})
//Create FullAdders
val fadder = Seq.tabulate(n) {
x => Module(new FullAdder())
}
//Setup
val summ = chisel3.Vec(n, Bool())
val carry = chisel3.Vec(n+1, UInt(1.W))
carry(0) := io.cin
//Do the wiring
for(inx <- 0 to n){
fadder(inx).io.a := io.a(inx)
fadder(inx).io.b := io.b(inx)
fadder(inx).io.cin := io.cin
carry(inx+1) := fadder(inx).io.cout
summ(inx) := fadder(inx).io.sum
}
io.sum := summ.asUInt()
io.cout := carry(n+1)
}
这是错误:
data to be connected 'UInt<1>' must be hardware, not a bare Chisel type
at rca.RcaAdder.<init>(RcaAdder.scala:40)
RcaAdder.scala:40
尝试在 Wire() 或 IO() 中包装进位或求和,但这没有帮助。 :(
有什么想法吗?真的在这里挣扎。
|史蒂夫 |关于必须使用 Wire wrapper 的说法是正确的,但还有其他一些错误。
- 将
Wire
包装器添加到summ
和carry
- 你的 for 语句应该使用
until
而不是to
- 应该是
io.cout := carry(n)
而不是n+1
下面的代码应该可以工作。
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))
})
//Create FullAdders
val fadder = Seq.tabulate(n) {
x => Module(new FullAdder())
}
//Setup
val summ = Wire(chisel3.Vec(n, Bool()))
val carry = Wire(chisel3.Vec(n+1, UInt(1.W)))
carry(0) := io.cin
//Do the wiring
for(inx <- 0 until n){
fadder(inx).io.a := io.a(inx)
fadder(inx).io.b := io.b(inx)
fadder(inx).io.cin := io.cin
carry(inx+1) := fadder(inx).io.cout
summ(inx) := fadder(inx).io.sum
}
io.sum := summ.asUInt()
io.cout := carry(n)
}
这里的问题是使用 foldLeft
而不是 for
IMO 的好例子,因为它减少了出现索引错误的机会。