Ошибка отрицательного значения Chisel UInt

Я недавно начал работать в scala, и мне нужно создать реализацию MD5. Насколько я понимаю, MD5 требует беззнаковых типов, которых у scala нет. Поскольку я скоро начну работать с Chisel, у которого есть неподписанные типы, я решил реализовать его библиотеку. Пока все выглядит хорошо, за исключением того, что при выполнении следующих побитовых операций мое значение F становится -271733879, что вызывает ошибку «Причина: java.lang.IllegalArgumentException: требование не выполнено: UInt literal -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)

Любая помощь будет принята с благодарностью.


person John Johns    schedule 12.06.2017    source источник


Ответы (1)


Ради своего ответа я использую предпочтительный 123.U стиль Chisel 3 для указания литералов, а не стиль Chisel 2 UInt(123), но этот ответ работает и для того, и для другого.

Есть несколько способов сделать это:

  • Use Scala Long (put L at end of literal)
    • val myUInt = 0x98badcfeL.U
    • Очевидно, это не сработает для более 64-битных
  • Use Scala BigInt
    • val myUInt = BigInt("98badcfe", 16).U
  • Use Chisel's shorthand for constructing BigInts from Strings
    • val myUInt = "x98badcfe".U
    • шестнадцатеричный = х | h, dec = d, oct = o, bin = b
person Jack Koenig    schedule 12.06.2017