Почему неявное преобразование типов из Int в UInt не работает? - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь изучить 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 уже есть неявный преобразователь типов, такой как мой преобразователь, но это, вероятно, не правильно.

Где мои ошибки?

1 Ответ

0 голосов
/ 11 января 2019

Я думаю, что самый близкий ответ - второй ответ здесь . Короче говоря, поскольку VecInit параметризован с помощью [T <: Data], все пространство T не ищется, чтобы увидеть, что неявные преобразования могут вернуть T. </p>

Вы можете вручную форсировать правильное неявное выражение, подобное этому

val v = VecInit[UInt](0x20, 0x30)

Я хотел бы отметить, что более ранние версии долота позволяли использовать параметры Int в VecInit и его союзниках. Наш опыт показал, что требования к конкретным типам оборудования были менее подвержены ошибкам и легче читались. Добавление .U к числам - это довольно низкие накладные расходы.

val v = VecInit(0x20.U, 0x30.U)
...