【问题标题】:Chisel UInt negative value error凿子 UInt 负值错误
【发布时间】:2017-06-12 20:01:57
【问题描述】:

我最近开始在 scala 中工作,需要创建 MD5 的实现。我的理解是 MD5 需要无符号类型,而 scala 没有。由于我将很快开始使用确实有无符号类型的 Chisel,因此我决定实现它的库。到目前为止一切看起来都很好,除了在执行以下按位运算时,我的 F 值变为 -271733879,这会导致错误“由:java.lang.IllegalArgumentException:要求失败:UInt 文字 -271733879 为负”,因为 UInts 不能消极。

if(i<16){
      F = ((B & C) | ((~B) & D))
      g = i
}

错误消息还有更多内容,但只是由于此错误而出现错误的不同库和类的跟踪列表,因此我没有发布它,因为我认为它不重要。如果是,我可以编辑并发布所有内容。

我的 B、C 和 D 值等于下面列出的小写等效值,这是第一次通过 for 循环,因此它们尚未更新。

var a0 : UInt = UInt(0x67452301)
var b0 : UInt = UInt(0xefcdab89)
var c0 : UInt = UInt(0x98badcfe)
var d0 : UInt = UInt(0x10325476)

任何帮助将不胜感激。

【问题讨论】:

    标签: scala md5 negative-number chisel uint


    【解决方案1】:

    为了我的回答,我使用 Chisel 3 首选 123.U 样式来指定文字,而不是 Chisel 2 UInt(123) 样式,但这个答案适用于任何一个。

    有几种方法可以做到这一点:

    • 使用 Scala Long(将 L 放在文字末尾)
      • val myUInt = 0x98badcfeL.U
      • 这显然不适用于大于 64 位的操作系统
    • 使用Scala BigInt
      • val myUInt = BigInt("98badcfe", 16).U
    • 使用 Chisel 的简写从字符串构造 BigInts
      • val myUInt = "x98badcfe".U
      • 十六进制 = x | h, dec = d, oct = o, bin = b

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多