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)
这不是实例化 FullAdders
的 Vec
,而只是创建具有该类型元素的 Vec。以下为我编译。它从实例化的 FullAdders 的序列创建 Vec。
val FAs = VecInit(Seq.fill(n)(Module(new FullAdder()).io))
它试图消除像这样推动 chisel3 有点不同的 API 的代码的歧义。希望对您有所帮助。
有兴趣让一些 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)
这不是实例化 FullAdders
的 Vec
,而只是创建具有该类型元素的 Vec。以下为我编译。它从实例化的 FullAdders 的序列创建 Vec。
val FAs = VecInit(Seq.fill(n)(Module(new FullAdder()).io))
它试图消除像这样推动 chisel3 有点不同的 API 的代码的歧义。希望对您有所帮助。