Я пытаюсь изучить chisel3, и я также пытаюсь использовать неявное преобразование типов из Int в UInt в конкретном случае.
Ниже приведен мой код.
package VecTest
import chisel3._
import scala.language.implicitConversions
object VecTestMain extends App {
Driver.execute(args, () => new VecTest)
}
object VecTest {
implicit def int2UInt(x: Int) = new fromtIntToLiteral(x).U
}
class VecTest extends Module {
import VecTest._
val io = IO(new Bundle{
val in = Input(UInt(1.W))
val out = Output(UInt(8.W))
})
val v = VecInit(0x20, 0x30)
io.out := v(io.in)
}
Я ожидал, что компилятор scala попытается преобразовать два значения в VecInit из Int в UInt, но компилятор сообщает об ошибке, как показано ниже.
[error] /src/directory/this/code/VecTest/VecTest.scala:23:11: inferred type arguments [Int] do not conform to macro method apply's type parameter bounds [T <: chisel3.core.Data]
[error] val v = VecInit(0x20, 0x30)
[error] ^
[error] /src/directory/this/code/VecTest/VecTest.scala:23:19: type mismatch;
[error] found : Int(32)
[error] required: T
[error] val v = VecInit(0x20, 0x30)
[error] ^
[error] /src/directory/this/code/VecTest/VecTest.scala:23:25: type mismatch;
[error] found : Int(48)
[error] required: T
[error] val v = VecInit(0x20, 0x30)
[error] ^
[error] three errors found
Во-первых, мой компилятор не может получить int2UInt
(неявная функция преобразования типов в object VecTest
) из-за пределов видимости. Однако, когда я исправлю код, как показано ниже, он будет работать.
val v = VecInit(int2UInt(0x20), int2UInt(0x30))
Я также выдвигаю гипотезу, что у chisel3 уже есть неявный преобразователь типов, такой как мой преобразователь, но это, вероятно, не правильно.
Где мои ошибки?