Chisel UInt负值错误

时间:2017-06-12 20:01:58

标签: scala md5 negative-number chisel uint

我最近开始使用scala,我需要创建MD5的实现。据我所知,MD5需要无符号类型,scala没有附带。我很快就会开始使用Chisel,它有无符号类型,我决定实现它的库。到目前为止一切看起来都不错,除了在进行下面的按位操作时,我的F值变为-271733879,这会导致错误"引起:java.lang.IllegalArgumentException:要求失败:UInt文字-271733879为否定"因为UI不能为负。

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)

非常感谢任何帮助。

1 个答案:

答案 0 :(得分: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
    • hex = x | h,dec = d,oct = o,bin = b