Altifigence Academy

18 / 63 · Теория

Компараторы и спецификация граничных значений

Различайте unsigned- и signed-сравнение одинаковых битовых строк и проверяйте граничные условия.

Порядок определяется старшим различающимся разрядом

Сравнивайте два unsignedБеззнаковая интерпретация (unsigned) рассматривает битовую последовательность как неотрицательное целое. Диапазон n бит — от 0 до 2^n−1; знаковая интерпретация тех же битов может дать другое число. Подробнее-вектора от MSBMSB — бит с наибольшим позиционным весом. Его индекс зависит от направления объявления вектора, поэтому нельзя всегда считать его битом с наибольшим номером. Подробнее до первого различия. Больше тот, у которого в этом разряде 1. Если ei=ai⊕bi‾e_i=\overline{a_i\oplus b_i}, условие «больше» для 4 бит:

gt⁡(a,b)=a3b‾3+e3a2b‾2+e3e2a1b‾1+e3e2e1a0b‾0\operatorname{gt}(a,b)=a_3\overline b_3+e_3a_2\overline b_2+e_3e_2a_1\overline b_1+e_3e_2e_1a_0\overline b_0

gt⁡(a,b)\operatorname{gt}(a,b) слева — булев результат сравнения. Младший разряд влияет на результат только при равенстве всех старших. Равенство векторов — AND всех eie_i.

Знаковое сравнение сначала учитывает знак

4'b1111 и 4'b0001 означают 15 и 1 как unsigned, но −1 и 1 как signed. При разных знаках отрицательное число меньше. Отличие logic [3:0] от logic signed [3:0] — не объём хранения, а интерпретация при операциях.

SystemVerilog
logic [3:0] a, b;
logic unsigned_lt, signed_lt;
assign unsigned_lt = a < b;
assign signed_lt = $signed(a) < $signed(b);

В коде операнды имеют одинаковую ширину. Если ширины различны, до простого приведения типа нужно определить, до какой ширины их расширять.

Даже порядок одной пары битовых строк меняется при других правилах знаковой интерпретации. Не применяйте unsigned-правило сравнения старших разрядов к signed без изменений.

Определите интерпретацию до сравнения битовых последовательностей
  1. 1111 и 0001: Одни и те же 4-битные входы
  2. Без знака: 15 больше 1
  3. Со знаком: −1 меньше 1

Зафиксируйте границы словами

Для буфера на 16 элементов count==16 означает full, а count<16 — возможность добавить элемент. Если count имеет 4 бита, число 16 непредставимо и само условие full не работает. Поэтому функцию компаратора и диапазон сравниваемой величины рассматривают совместно.

Для порога TT сначала проверьте T−1,T,T+1T-1,T,T+1, отдельно обрабатывая значения вне диапазона представления. Создавайте тесты, намеренно различающие < и <=. Сравнение значения уже после unsigned-перехода через границу не восстанавливает потерянный carry.

Попробуйте сами

Сколько бит нужно счётчику заполнения FIFO для значений 0–16? Можно ли одним сравнением определить, разрешены ли одновременные pop и push при full?

Прочитать объяснение

Для 17 значений нужны 5 бит. Возможность принять push на место одновременно извлекаемого элемента задаёт политика интерфейса. Одно count < 16 может запретить одновременный обмен при full; чтобы разрешить его, нужно учитывать фактическое принятие pop.

Выбор действует в этом браузере. Его можно изменить внизу страницы.