Chisel2 代码 运行 调用兼容层 - 类型转换问题

Chisel2 code run invoking compatibility layer - type casting issues

有兴趣让一些 Chisel2 代码在 Chisel3 平衡中工作,我设法得到了 Chisel2 凿子教程示例,例如 FullAdder:

class FullAdder extends Module { 
  val io = new Bundle { 
    val a    = UInt(INPUT, 1) 
    val b    = UInt(INPUT, 1) 
    val cin  = UInt(INPUT, 1) 
    val sum  = UInt(OUTPUT, 1) 
    val cout = UInt(OUTPUT, 1) 
  } 
  // Generate the sum 
  val a_xor_b = io.a ^ io.b 
  io.sum := a_xor_b ^ io.cin 
  // Generate the carry 
  val a_and_b = io.a & io.b 
  val b_and_cin = io.b & io.cin 
  val a_and_cin = io.a & io.cin 
  io.cout := a_and_b | b_and_cin | a_and_cin 
}

向上和运行命令:

>test:runMain examples.Launcher FullAdder

使用行中包含的一些魔法粉尘:

import Chisel._

但是,一旦我尝试在此示例中实例化 FullAdder(当然添加 import Chisel._):

class Adder(val n:Int) extends Module {
  val io = new Bundle {
    val A    = UInt(INPUT, n)
    val B    = UInt(INPUT, n)
    val Cin  = UInt(INPUT, 1)
    val Sum  = UInt(OUTPUT, n)
    val Cout = UInt(OUTPUT, 1)
  }
  //create a vector of FullAdders
  val FAs   = Vec(n, Module(new FullAdder()).io)
  val carry = Wire(Vec(n+1, UInt(width = 1)))
  val sum   = Wire(Vec(n, Bool()))

  //first carry is the top level carry in
  carry(0) := io.Cin

  //wire up the ports of the full adders
  for (i <- 0 until n) {
    FAs(i).a := io.A(i)
    FAs(i).b := io.B(i)
    FAs(i).cin := carry(i)
    carry(i+1) := FAs(i).cout
    sum(i) := FAs(i).sum.toBool()
  }
  io.Sum := sum.toBits.toUInt()
  io.Cout := carry(n)
}

我收到有关此行的错误:

  io.Sum := sum.toBits.toUInt()

如下:

[error] /home/apaj/testing-learning-journey/learning-journey/src/main/scala/examples/Adder.scala:32: not enough arguments for method toUInt: (implicit compileOptions: chisel3.core.CompileOptions)chisel3.core.UInt.
[error] Unspecified value parameter compileOptions.
[error]   io.Sum := sum.toBits.toUInt()

找到的信息 here and here 使我得出结论,我应该尝试使用 asUInt() 而不是 toUInt()

但是,这会导致我的请求出现以下输出:

> test:run-main examples.Launcher Adder
[info] Running examples.Launcher Adder
Starting tutorial Adder
[info] [0.001] Elaborating design...
chisel3.core.Binding$ExpectedHardwareException: bits to be indexed 'chisel3.core.UInt@30' must be hardware, not a bare Chisel type

之后是很多类似 java 的投诉,最后是:

================================================================================
Errors: 1: in the following tutorials
Tutorial Adder: exception bits to be indexed 'chisel3.core.UInt@30' must be hardware, not a bare Chisel type
================================================================================

我能找到的唯一相关资源是这个 bug report,但我真的不知道如何实施这个建议以及我应该在哪里解决这个 [=54= 的问题] 必须是硬件.

我想我还遗漏了一些我应该导入的东西,以便在这种情况下正确翻译 asUInt(),但恐怕我没有看到它。如果可能,请提供帮助或至少提供进一步阅读的指导 - 非常感谢,谢谢!

我对 Chisel2 部件有点生疏,但我认为问题(在你正确修复后使用 io.Sum := sum.asUInt())是行

  val FAs   = Vec(n, Module(new FullAdder()).io)

这不是实例化 FullAddersVec,而只是创建具有该类型元素的 Vec。以下为我编译。它从实例化的 FullAdders 的序列创建 Vec。

  val FAs   = VecInit(Seq.fill(n)(Module(new FullAdder()).io))

它试图消除像这样推动 chisel3 有点不同的 API 的代码的歧义。希望对您有所帮助。