为什么从Int到UInt的隐式类型转换不起作用?

时间:2019-01-11 14:09:58

标签: scala chisel

我正在尝试学习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

首先,我的编译器由于超出范围而无法获得int2UIntobject VecTest中的隐式类型转换器函数)。但是,当我修复如下代码时,它将起作用。

val v = VecInit(int2UInt(0x20), int2UInt(0x30))

我还做出了一个假设,即chisel3已经具有像我的转换器那样的隐式类型转换器,但这可能是不正确的。

我的错误在哪里?

1 个答案:

答案 0 :(得分:3)

我认为最接近的答案是第二个答案here。 简而言之,因为VecInit是用[T <:Data]参数化的,所以不会搜索T的整个空间以查看哪些隐式转换可能返回T。

您可以像这样手动强制适当的隐式

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

我想指出的是,凿子的早期版本允许VecInit及其盟友使用Int参数。我们的经验是,要求特定的硬件类型不易出错,更易于阅读。在数字中加上.U可以节省相当少的模板开销。

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