Altifigence Academy

6 / 37 · Теория

Индексы векторов, порядок битов и знак

Читайте тракт данных, разделяя номера битов, порядок последовательной передачи и арифметическую интерпретацию.

Индекс — имя; смысл задаёт направление объявления

В logic [7:0] a; крайний левый разряд — a[7], а в logic [0:7] b; — b[0]. После присваивания обоим 8'h96 строки слева направо одинаковы, 10010110, но индексы битов различаются. Предположение «бит 0 всегда LSBLSB — бит с наименьшим позиционным весом. Проверяйте одновременно направление записи и правила индексации.» допустимо лишь после проверки направления объявления.

На практике согласованное направление во всём интерфейсе облегчает ревью. Явно задавайте и порядок отображения в просмотрщике диаграмм, и порядок битовых массивов в файлах. Входные JSON-массивы курса записываются от LSB, а RTL-векторы обычно читаются от MSBMSB — бит с наибольшим позиционным весом. Его индекс зависит от направления объявления вектора, поэтому нельзя всегда считать его битом с наибольшим номером..

Проверяйте направление по реальным соединениям

В q <= {q[1:0], din}; следующим q[2] будет прежнее q[1], следующим q[1] — прежнее q[0], следующим q[0] — din.

q2next=q1,q1next=q0,q0next=dq_2^{next}=q_1,\quad q_1^{next}=q_0,\quad q_0^{next}=d

Точная спецификация — какой индекс получает какой сигнал, а не направление рисунка влево или вправо.

Стрелки показывают позиции хранения, через которые проходит бит. Все регистрыРегистр хранит многобитное состояние. Синхронные регистры в этом курсе записывают определённый вход на фронте тактового сигнала. Подробнее читают прежние значения на одном фронте. Это не означает прохождения din до q2 за один фронт.

Читайте путь перемещения по номерам битов
  1. din: Бит, принимаемый на этом фронте
  2. q0: Захватите din
  3. q1: Захватите прежнее q0
  4. q2: Захватите прежнее q1

Арифметический и логический сдвиги

>> — логический сдвиг вправо, заполняющий нулями освободившиеся левые, старшие позиции. >>> можно использовать как арифметический сдвиг с расширением знака, если левый операнд signed. Даже для одинаковых битов результат зависит от знаковости операнда.

SystemVerilog
logic signed [7:0] x;
logic [7:0] logical_right, arithmetic_right;
assign logical_right = x >> 1;
assign arithmetic_right = x >>> 1;

При x=8'b11111000 (−8) результаты соответственно 01111100 и 11111100. Арифметический сдвиг отрицательного числа вправо не всегда совпадает с правилом округления отрицательного целочисленного деления, поэтому в численных алгоритмах это проверяют отдельно.

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

Для 3-битного q=101 и din=0 найдите следующие значения при q<={q[1:0],din} и q<={din,q[2:1]}.

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

Оба выражения дают 010: на этом входе направления случайно совпадают. При q=001, din=0 получаются 010 и 000, что позволяет различить ошибку направления.

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