17 / 37 · Практика
Практикум: сброс, циклический переход и инварианты счётчика
Сравните состояние на каждом положительном фронте с эталоном, разделите влияние начального значения, сброса и ширины.
Уроки доступны бесплатно. Запишитесь, чтобы сохранять прогресс.
Объект эксперимента и условия наблюдения
Начальное значение задаём 3 и сбрасываемСброс возвращает состояние к заданному начальному значению. Нужно определить, синхронен он или асинхронен и имеет ли приоритет над другими управляющими сигналами. Подробнее на первом положительном фронтеПоложительный фронт — момент перехода такта из 0 в 1. Его следует отличать от уровня, означающего весь интервал CLK=1. Подробнее. Далее получаем 0, 1, 2, 3, 0. Даже при активном reset значение до фронта остаётся прежним.
Перед началом
Подготовьте Desktop-проект Digital Design Studio и действующее разрешение на выполнение. Каждый пример сохраните в отдельной папке как rtl/top.sv.
Исходный код 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 port | rst · Active high · 1 cycle |
| Maximum cycles / time | 5 / 5000ps |
Входные воздействия
[
{
"inputs": {}
},
{
"inputs": {}
},
{
"inputs": {}
},
{
"inputs": {}
},
{
"inputs": {}
}
]Каждый столбец — запись наблюдения одного положительного фронтаПоложительный фронт — момент перехода такта из 0 в 1. Его следует отличать от уровня, означающего весь интервал CLK=1. Подробнее. Входы показаны непосредственно перед фронтом, состояния со словом «после» в имени — сразу после обновления. Выравнивание столбцов обозначает порядок выборок, а не физическую задержку распространенияЗадержка распространения — время от изменения входа до установления правильного выхода. Логическая эквивалентность выражений и их временные характеристики — разные вопросы. Подробнее.
E0–E4 — положительные фронты в 500, 1500, 2500, 3500, 4500ps. Сравните все промежуточные столбцы count, а не только итог.
Показать данные диаграммы
| Сигнал | Диаграмма | Значения шины |
|---|---|---|
| фронт | 23452 | E0 → E1 → E2 → E3 → E4 |
| reset | 10... | |
| count до | 23452 | 11 → 00 → 01 → 10 → 11 |
| count после | 23452 | 00 → 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. Не отождествляйте инициализацию со сбросом.
| Положительный фронт | rst | count до фронта | count после фронта |
|---|---|---|---|
| 500ps | 1 | 11 | 00 |
| 1500ps | 0 | 00 | 01 |
| 2500ps | 0 | 01 | 10 |
| 3500ps | 0 | 10 | 11 |
| 4500ps | 0 | 11 | 00 |
На каждом фронте без сброса должно выполняться:
Проверка лишь конечного 00 может пропустить неверные промежуточные состояния. Отдельно проверяйте всю последовательность и приоритет сброса.
Меняйте по одному условию эксперимента
- Даже при начальном 00 последовательность после первого сброса та же. Это проверяет независимость reset от начального значения.
- При Reset cycles=2 count на первых двух положительных фронтах должен быть 00. Начало увеличения сдвинется на один фронт.
- При ширине 3 бита полный цикл занимает восемь увеличений. Проверьте не только объявление, но и ширину констант, массив начальных регистров и длину запуска.
Обобщение до modulo-10
4-битное хранилище представляет 0–15, поэтому простое увеличение не даёт 0 после 9. Нужно отдельно определить функцию следующего состояния.
Это определение возвращает неиспользуемые 10–15 в 0 при enable. Возможны другие политики восстановления, но спецификация и эталон должны использовать одну и ту же.
Попробуйте сами
После сброса на первом положительном фронте исходный 2-битный счётчик без enable увеличивается 11 раз. Найдите count без перечисления промежуточных состояний.
Прочитать объяснение
После сброса состояние 0, а , то есть 11. «Всего 11 фронтов» отличается от «11 увеличений после сброса»: если первый из 11 фронтов — сброс, увеличений только 10.