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 包装器添加到 summcarry
  • 你的 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 的好例子,因为它减少了出现索引错误的机会。