почему chisel UInt (32.W) не может принимать беззнаковое число, у которого бит [32] оказывается равным 1?

Определено, что UInt - это тип целого числа без знака. Но в таком случае похоже, что MSB все еще является знаком. например, наиболее относительной проверкой качества является ошибка отрицательного значения Chisel UInt, которая позволяет обходное решение, но Нет почему. Не могли бы вы объяснить мне «почему»?

UInt, похоже, определен в chisel3 / chiselFrontend / src / main / scala / chisel3 / core / Bits.scala, но я не могу понять детали. Является ли UInt производным от Bits, а Bits является производным от Int от scala?


person Lin Frank    schedule 29.06.2017    source источник


Ответы (2)


Ответ прост: это связано с тем, как Scala оценивает вещи. Рассмотрим пример вроде

val x = 0xFFFFFFFF.U

Это утверждение вызывает ошибку. Литерал UInt внутренне представлен BigInts, но 0xFFFFFFFF - это значение Int. 0xFFFFFFFF эквивалентно значению Int -1. Значение -1 Int преобразуется в BigInt -1 и -1. U является недопустимым, поскольку метод создания литерала .U не принимает отрицательные значения. Добавление L исправляет это, поскольку 0xFFFFFFFL является положительным значением Long.

person Chick Markley    schedule 29.06.2017

Проблема в том, что Scala только имеет целые числа со знаком, у него нет целочисленного типа без знака. Из REPL

scala> 0x9456789a
res1: Int = -1806272358

Таким образом, Chisel видит только отрицательное число. Очевидно, что UInts не может быть отрицательным, поэтому Chisel сообщает об ошибке.

Вы всегда можете преобразовать SInt в UInt, если хотите, чтобы необработанное 2-дополнительное представление отрицательного числа интерпретировалось как UInt. например.

val a = -1.S(32.W).asUInt
assert(a === "xffffffff".U)
person Jack Koenig    schedule 29.06.2017
comment
Настоящая проблема в том, что Java имеет только целые числа со знаком. И поскольку Scala построена на основе Java, эти фундаментальные настройки должны быть сохранены. - person iBug; 29.07.2020