代码之家  ›  专栏  ›  技术社区  ›  Lin Frank

为什么凿子UInt(32.W)不能接受位[32]恰好为1的无符号数?

  •  1
  • Lin Frank  · 技术社区  · 9 年前

    定义如下: UInt Chisel UInt negative value error 这解决了一个问题,但没有什么原因。你能告诉我为什么吗?

    这个 似乎在凿3/凿前端/src/main/scala/凿3/core/Bits中定义。但我不能理解细节。是 UInt公司 是从位派生的,位是从Int派生的 scala

    2 回复  |  直到 9 年前
        1
  •  2
  •   Chick Markley    9 年前

    简单的答案是,这是由于Scala如何评估事物。 考虑这样一个例子

    val x = 0xFFFFFFFF.U
    

    此语句导致错误。 UInt literal在内部由bigint表示,但0xffffff是一个指定Int值的函数。0xFFFFFF相当于Int值-1。 -1 Int值被转换为BigInt-1和-1。U是非法的,因为.U文字创建方法不接受负值。 添加

        2
  •  1
  •   Jack Koenig    9 年前

    问题是Scala 只有 具有有符号整数,但它没有无符号整数类型。从REPL

    scala> 0x9456789a
    res1: Int = -1806272358
    

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

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