40 / 63 · Практика
Практикум: сдвиг последовательных данных и проверка порядка битов
Проверяйте направление, потерю битов и задержку после сброса с помощью битовых строк и целочисленного эталона.
Уроки доступны бесплатно. Запишитесь, чтобы сохранять прогресс.
Объект эксперимента и условия наблюдения
На каждом положительном фронтеПоложительный фронт — момент перехода такта из 0 в 1. Его следует отличать от уровня, означающего весь интервал CLK=1. Подробнее прежние два младших бита q сдвигаются влево, din входит в бит 0. Последовательно подайте 1, 0, 1, 1 и сравните перемещение.
Перед началом
Подготовьте Desktop-проект Digital Design Studio и действующее разрешение на выполнение. Сохраните каждый пример как rtl/top.sv в отдельной папке.
Исходный код 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 port | rst · Active high · 1 cycle |
| Maximum cycles / time | 5 / 5000ps |
Входные воздействия
[
{
"inputs": {
"din": [
false
]
}
},
{
"inputs": {
"din": [
true
]
}
},
{
"inputs": {
"din": [
false
]
}
},
{
"inputs": {
"din": [
true
]
}
},
{
"inputs": {
"din": [
true
]
}
}
]Каждый столбец — запись наблюдения одного положительного фронтаПоложительный фронт — момент перехода такта из 0 в 1. Его следует отличать от уровня, означающего весь интервал CLK=1. Подробнее. Входы показаны непосредственно перед фронтом, состояния со словом «после» в имени — сразу после обновления. Выравнивание столбцов обозначает порядок выборок, а не физическую задержку распространенияЗадержка распространения — время от изменения входа до установления правильного выхода. Логическая эквивалентность выражений и их временные характеристики — разные вопросы. Подробнее.
Первый столбец — фронт сбросаСброс возвращает состояние к заданному начальному значению. Нужно определить, синхронен он или асинхронен и имеет ли приоритет над другими управляющими сигналами. Подробнее; din=0 не считается сохраняемыми данными. Сравните следующие четыре входа с порядком JSON.
Показать данные диаграммы
| Сигнал | Диаграмма | Значения шины |
|---|---|---|
| фронт | 23452 | E0 → E1 → E2 → E3 → E4 |
| reset | 10... | |
| din | 0101. | |
| q после | 23452 | 000 → 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; знаковая интерпретация тех же битов может дать другое число. Подробнее-целое.
После reset входы 1, 0, 1, 1 дают . В 3-битной двоичной записи это должно совпасть с диаграммой практикума. На последнем шаге ; сохранение лишь трёх младших битов даёт 3.
| Принято битов | Вход | q после фронта | Целое значение |
|---|---|---|---|
| 0 | Сброс | 000 | 0 |
| 1 | 1 | 001 | 1 |
| 2 | 0 | 010 | 2 |
| 3 | 1 | 101 | 5 |
| 4 | 1 | 011 | 3 |
При reset=0, enable=1 выбирайте din=1,0,1,1 и нажимайте такт каждый раз. Получите q=001,010,101,011. Сначала спрогнозируйте по шаговой модели, затем сравните с фактическим RTL. Enable включён также для проверки остановки из дополнительного задания ниже.
Синхронный сброс приоритетнее enable. При enable=0 сохранённое значение удерживается. q=000; q_next = (2q + din) mod 8
Проследите один бит для проверки направления
После reset подайте одну 1 и три нуля. Состояния: 001 → 010 → 100 → 000. Первая 1 должна пройти биты 0, 1, 2 и исчезнуть. Только сплошные нули или единицы могут скрыть неверное направление.
В трёхступенчатом регистреРегистр хранит многобитное состояние. Синхронные регистры в этом курсе записывают определённый вход на фронте тактового сигнала. Подробнее бит, впервые сохранённый на фронте , достигает старшего бита 2 после фронта . Если отсчитывать от запуска данных внешним передающим регистром, начало отсчёта другое. В отчёте явно укажите начальную и конечную точки.
Дополнительное задание: сдвигать только действительные входы
Предположим, добавлен valid. Схема, хранящая q при valid=0, отличается от конвейера, сдвигающегося каждый цикл вместе с отдельным битом valid. Первая обновляется по мере приёма битов, второй — на каждом реальном такте. Нельзя проверять их одной ожидаемой последовательностью состояний.
Попробуйте сами
После сброса действительные биты идут 1, 0, 1. До и после второго бита есть по одному циклу valid=0, в которых q хранится. Объясните последнее q и момент прихода первой 1 в бит 2.
Прочитать объяснение
Только три действительных входа меняют состояние, поэтому итог q=101. Первая 1 достигает бита 2 на фронте сохранения третьего действительного входа. После первого захвата нужны ещё два сдвига, а два invalid-цикла дополнительно увеличивают реальное время.