【问题标题】:why chisel UInt(32.W) can not take a unsigned number which bit[32] happens to be 1?为什么凿子 UInt(32.W) 不能采用位 [32] 恰好为 1 的无符号数?
【发布时间】:2017-06-29 09:37:31
【问题描述】:

定义UInt为无符号整数类型。但在这种情况下,MSB 似乎仍然是一个标志。例如,最相关的 QA 是 Chisel UInt negative value error,它可以解决问题但没有原因。你能告诉我“为什么”吗?

UInt 似乎在 chisel3/chiselFrontend/src/main/scala/chisel3/core/Bits.scala 中定义,但我无法理解细节。 UInt是从Bits派生出来的,而Bits是从scala的Int派生出来的?

【问题讨论】:

    标签: scala int bits chisel uint


    【解决方案1】:

    简单的答案是,这是由于 Scala 评估事物的方式。 考虑一个像

    这样的例子
    val x = 0xFFFFFFFF.U
    

    此语句会导致错误。 UInt 文字在内部由 BigInts 表示,但 0xFFFFFFFF 是一个指定的 Int 值。 0xFFFFFFFF 相当于 Int 值 -1。 -1 Int 值转换为 BigInt -1 并且 -1.U 是非法的,因为 .U 文字创建方法不会接受负值。 添加 L 可以解决此问题,因为 0xFFFFFFFL 是一个正的 Long 值。

    【讨论】:

      【解决方案2】:

      问题在于 Scala only 有有符号整数,它没有无符号整数类型。来自 REPL

      scala> 0x9456789a
      res1: Int = -1806272358
      

      因此,Chisel 只能看到负数。 UInts 显然不能为负数,所以 Chisel 会报错。

      如果您希望将负数的原始 2 的补码表示解释为 UInt,则始终可以从 SInt 转换为 UInt。例如。

      val a = -1.S(32.W).asUInt
      assert(a === "xffffffff".U)
      

      【讨论】:

      • 真正的问题是 Java 只有有符号整数。而且因为 Scala 是建立在 Java 之上的,所以它必须保留这些基本设置。
      猜你喜欢
      • 2011-03-11
      • 2011-02-08
      • 2014-03-27
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      相关资源
      最近更新 更多