Altifigence Academy

17 / 37 · Практика

Практикум: сброс, циклический переход и инварианты счётчика

Сравните состояние на каждом положительном фронте с эталоном, разделите влияние начального значения, сброса и ширины.

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

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

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

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

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

SystemVerilog
module top (
    input logic clk,
    input logic rst,
    output logic [1:0] count
);
    // Active-high synchronous reset: sampled only at the rising clock edge.
    always_ff @(posedge clk)
        if (rst) count <= 2'b00;
        else count <= count + 2'b01;
endmodule

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

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

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

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

json
[
  {
    "inputs": {}
  },
  {
    "inputs": {}
  },
  {
    "inputs": {}
  },
  {
    "inputs": {}
  },
  {
    "inputs": {}
  }
]

Каждый столбец — запись наблюдения одного положительного фронтаПоложительный фронт — момент перехода такта из 0 в 1. Его следует отличать от уровня, означающего весь интервал CLK=1. Подробнее. Входы показаны непосредственно перед фронтом, состояния со словом «после» в имени — сразу после обновления. Выравнивание столбцов обозначает порядок выборок, а не физическую задержку распространенияЗадержка распространения — время от изменения входа до установления правильного выхода. Логическая эквивалентность выражений и их временные характеристики — разные вопросы. Подробнее.
E0–E4 — положительные фронты в 500, 1500, 2500, 3500, 4500ps. Сравните все промежуточные столбцы count, а не только итог.

Пять положительных фронтов практической работы
Показать данные диаграммы
Данные диаграммы: каждый символ — один интервал; точка сохраняет предыдущее состояние; p — один тактовый цикл.
СигналДиаграммаЗначения шины
фронт23452E0 → E1 → E2 → E3 → E4
reset10...
count до2345211 → 00 → 01 → 10 → 11
count после2345200 → 01 → 10 → 11 → 00

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

5 cycles · count=00. В 500, 1500, 2500, 3500, 4500ps проверьте 00 → 01 → 10 → 11 → 00.

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

Рассчитайте ожидаемые состояния по фронтам

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

Положительный фронтrstcount до фронтаcount после фронта
500ps11100
1500ps00001
2500ps00110
3500ps01011
4500ps01100

На каждом фронте без сброса должно выполняться:

ck+1=(ck+1) mod 4c_{k+1}=(c_k+1)\bmod 4

Проверка лишь конечного 00 может пропустить неверные промежуточные состояния. Отдельно проверяйте всю последовательность и приоритет сброса.

Меняйте по одному условию эксперимента

  • Даже при начальном 00 последовательность после первого сброса та же. Это проверяет независимость reset от начального значения.
  • При Reset cycles=2 count на первых двух положительных фронтах должен быть 00. Начало увеличения сдвинется на один фронт.
  • При ширине 3 бита полный цикл занимает восемь увеличений. Проверьте не только объявление, но и ширину констант, массив начальных регистров и длину запуска.

Обобщение до modulo-10

4-битное хранилище представляет 0–15, поэтому простое увеличение не даёт 0 после 9. Нужно отдельно определить функцию следующего состояния.

ck+1={0rk=10rk=0 ∧ ek=1 ∧ ck≥9ck+1rk=0 ∧ ek=1 ∧ ck<9ckrk=0 ∧ ek=0c_{k+1}=\begin{cases}0 & r_k=1\\0 & r_k=0\ \land\ e_k=1\ \land\ c_k\ge 9\\c_k+1 & r_k=0\ \land\ e_k=1\ \land\ c_k<9\\c_k & r_k=0\ \land\ e_k=0\end{cases}

Это определение возвращает неиспользуемые 10–15 в 0 при enable. Возможны другие политики восстановления, но спецификация и эталон должны использовать одну и ту же.

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

После сброса на первом положительном фронте исходный 2-битный счётчик без enable увеличивается 11 раз. Найдите count без перечисления промежуточных состояний.

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

После сброса состояние 0, а 11 mod 4=311\bmod4=3, то есть 11. «Всего 11 фронтов» отличается от «11 увеличений после сброса»: если первый из 11 фронтов — сброс, увеличений только 10.

Lesson files

counter-top.sv ↓counter-inputs.json ↓

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