18 / 63 · Теория
Компараторы и спецификация граничных значений
Различайте unsigned- и signed-сравнение одинаковых битовых строк и проверяйте граничные условия.
Уроки доступны бесплатно. Запишитесь, чтобы сохранять прогресс.
Порядок определяется старшим различающимся разрядом
Сравнивайте два unsignedБеззнаковая интерпретация (unsigned) рассматривает битовую последовательность как неотрицательное целое. Диапазон n бит — от 0 до 2^n−1; знаковая интерпретация тех же битов может дать другое число. Подробнее-вектора от MSBMSB — бит с наибольшим позиционным весом. Его индекс зависит от направления объявления вектора, поэтому нельзя всегда считать его битом с наибольшим номером. Подробнее до первого различия. Больше тот, у которого в этом разряде 1. Если , условие «больше» для 4 бит:
слева — булев результат сравнения. Младший разряд влияет на результат только при равенстве всех старших. Равенство векторов — AND всех .
Знаковое сравнение сначала учитывает знак
4'b1111 и 4'b0001 означают 15 и 1 как unsigned, но −1 и 1 как signed. При разных знаках отрицательное число меньше. Отличие logic [3:0] от logic signed [3:0] — не объём хранения, а интерпретация при операциях.
logic [3:0] a, b;
logic unsigned_lt, signed_lt;
assign unsigned_lt = a < b;
assign signed_lt = $signed(a) < $signed(b);В коде операнды имеют одинаковую ширину. Если ширины различны, до простого приведения типа нужно определить, до какой ширины их расширять.
Даже порядок одной пары битовых строк меняется при других правилах знаковой интерпретации. Не применяйте unsigned-правило сравнения старших разрядов к signed без изменений.
- 1111 и 0001: Одни и те же 4-битные входы
- Без знака: 15 больше 1
- Со знаком: −1 меньше 1
Зафиксируйте границы словами
Для буфера на 16 элементов count==16 означает full, а count<16 — возможность добавить элемент. Если count имеет 4 бита, число 16 непредставимо и само условие full не работает. Поэтому функцию компаратора и диапазон сравниваемой величины рассматривают совместно.
Для порога сначала проверьте , отдельно обрабатывая значения вне диапазона представления. Создавайте тесты, намеренно различающие < и <=. Сравнение значения уже после unsigned-перехода через границу не восстанавливает потерянный carry.
Попробуйте сами
Сколько бит нужно счётчику заполнения FIFO для значений 0–16? Можно ли одним сравнением определить, разрешены ли одновременные pop и push при full?
Прочитать объяснение
Для 17 значений нужны 5 бит. Возможность принять push на место одновременно извлекаемого элемента задаёт политика интерфейса. Одно count < 16 может запретить одновременный обмен при full; чтобы разрешить его, нужно учитывать фактическое принятие pop.