Altifigence Academy

40 / 63 · Практика

Практикум: сдвиг последовательных данных и проверка порядка битов

Проверяйте направление, потерю битов и задержку после сброса с помощью битовых строк и целочисленного эталона.

Объект эксперимента и условия наблюдения

На каждом положительном фронтеПоложительный фронт — момент перехода такта из 0 в 1. Его следует отличать от уровня, означающего весь интервал CLK=1. Подробнее прежние два младших бита q сдвигаются влево, din входит в бит 0. Последовательно подайте 1, 0, 1, 1 и сравните перемещение.

Перед началом

Подготовьте Desktop-проект Digital Design Studio и действующее разрешение на выполнение. Сохраните каждый пример как rtl/top.sv в отдельной папке.

Исходный код SystemVerilog

SystemVerilog
module top (
    input logic clk,
    input logic rst,
    input logic din,
    output logic [2:0] q
);
    // Old q[1:0] and din are captured together at each rising edge.
    always_ff @(posedge clk)
        if (rst) q <= 3'b000;
        else q <= {q[1:0], din};
endmodule

Порядок запуска

В New analysis выберите Two-state single-clock v1, Clock port — clk, период — 1000ps. Выполните Preflight с настройками ниже, затем Run RTL simulation и сравните результаты.

ПараметрЗначение
Начальные значения регистров, от LSB[false,false,false]
Reset portrst · Active high · 1 cycle
Maximum cycles / time5 / 5000ps

Входные воздействия

json
[
  {
    "inputs": {
      "din": [
        false
      ]
    }
  },
  {
    "inputs": {
      "din": [
        true
      ]
    }
  },
  {
    "inputs": {
      "din": [
        false
      ]
    }
  },
  {
    "inputs": {
      "din": [
        true
      ]
    }
  },
  {
    "inputs": {
      "din": [
        true
      ]
    }
  }
]

Каждый столбец — запись наблюдения одного положительного фронтаПоложительный фронт — момент перехода такта из 0 в 1. Его следует отличать от уровня, означающего весь интервал CLK=1. Подробнее. Входы показаны непосредственно перед фронтом, состояния со словом «после» в имени — сразу после обновления. Выравнивание столбцов обозначает порядок выборок, а не физическую задержку распространенияЗадержка распространения — время от изменения входа до установления правильного выхода. Логическая эквивалентность выражений и их временные характеристики — разные вопросы. Подробнее.
Первый столбец — фронт сбросаСброс возвращает состояние к заданному начальному значению. Нужно определить, синхронен он или асинхронен и имеет ли приоритет над другими управляющими сигналами. Подробнее; din=0 не считается сохраняемыми данными. Сравните следующие четыре входа с порядком JSON.

Входные стимулы и перемещение состояния трёх битов
Показать данные диаграммы
Данные диаграммы: каждый символ — один интервал; точка сохраняет предыдущее состояние; p — один тактовый цикл.
СигналДиаграммаЗначения шины
фронт23452E0 → E1 → E2 → E3 → E4
reset10...
din0101.
q после23452000 → 001 → 010 → 101 → 011

Сравнение результата

5 cycles · q=011. На положительных фронтах: 000 → 001 → 010 → 101 → 011.

Практикум использует однотактовый RTL 0/1, без тестбенча с #delay, initial, X/Z. Отметка завершения урока — запись обучения, а не фактический результат симуляции.

Проверьте конкатенацию независимой формулой

Копирование той же конкатенацииКонкатенация соединяет битовые последовательности рядом друг с другом. Ширина результата равна сумме ширин операндов; это не арифметическое сложение чисел. Подробнее RTL в тестовый ответ может повторить одну ошибку в двух местах. Используйте эталон с интерпретацией как unsignedБеззнаковая интерпретация (unsigned) рассматривает битовую последовательность как неотрицательное целое. Диапазон n бит — от 0 до 2^n−1; знаковая интерпретация тех же битов может дать другое число. Подробнее-целое.

Qk+1=(2Qk+dk) mod 8Q_{k+1}=(2Q_k+d_k)\bmod 8

После reset входы 1, 0, 1, 1 дают 0→1→2→5→30\to1\to2\to5\to3. В 3-битной двоичной записи это должно совпасть с диаграммой практикума. На последнем шаге 2⋅5+1=112\cdot5+1=11; сохранение лишь трёх младших битов даёт 3.

Принято битовВходq после фронтаЦелое значение
0Сброс0000
110011
200102
311015
410113

При reset=0, enable=1 выбирайте din=1,0,1,1 и нажимайте такт каждый раз. Получите q=001,010,101,011. Сначала спрогнозируйте по шаговой модели, затем сравните с фактическим RTL. Enable включён также для проверки остановки из дополнительного задания ниже.

Предскажите порядок битов до запуска RTL

Синхронный сброс приоритетнее enable. При enable=0 сохранённое значение удерживается. q=000; q_next = (2q + din) mod 8

Проследите один бит для проверки направления

После reset подайте одну 1 и три нуля. Состояния: 001 → 010 → 100 → 000. Первая 1 должна пройти биты 0, 1, 2 и исчезнуть. Только сплошные нули или единицы могут скрыть неверное направление.

В трёхступенчатом регистреРегистр хранит многобитное состояние. Синхронные регистры в этом курсе записывают определённый вход на фронте тактового сигнала. Подробнее бит, впервые сохранённый на фронте kk, достигает старшего бита 2 после фронта k+2k+2. Если отсчитывать от запуска данных внешним передающим регистром, начало отсчёта другое. В отчёте явно укажите начальную и конечную точки.

Дополнительное задание: сдвигать только действительные входы

Предположим, добавлен valid. Схема, хранящая q при valid=0, отличается от конвейера, сдвигающегося каждый цикл вместе с отдельным битом valid. Первая обновляется по мере приёма битов, второй — на каждом реальном такте. Нельзя проверять их одной ожидаемой последовательностью состояний.

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

После сброса действительные биты идут 1, 0, 1. До и после второго бита есть по одному циклу valid=0, в которых q хранится. Объясните последнее q и момент прихода первой 1 в бит 2.

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

Только три действительных входа меняют состояние, поэтому итог q=101. Первая 1 достигает бита 2 на фронте сохранения третьего действительного входа. После первого захвата нужны ещё два сдвига, а два invalid-цикла дополнительно увеличивают реальное время.

Lesson files

shift-top.sv ↓shift-inputs.json ↓

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