Конвейеризация данных и valid
Часть раздела Проектирование и верификация RTL путешествия по Verilog на Coddy. Урок 18 из 38.
Конвейеры распределяют работу между регистрами. Флаг валидности перемещается рядом с каждым элементом данных, чтобы последующий этап мог отличить выборку от пустого такта. При неблокирующих присваиваниях последующий этап считывает предыдущее значение более раннего этапа на том же фронте тактового сигнала. Сброс должен сделать находящуюся в конвейере работу недействительной.
Соответствующий фрагмент; окружающие объявления и соединения предоставлены в задании.
always @(posedge clk) begin
stage <= data;
stage_valid <= in_valid;
result <= stage;
out_valid <= stage_valid;
endДанные и их признак допустимости проходят через одинаковое количество регистров.
Согласуйте данные и признак valid на каждом этапе конвейера и сбрасывайте признак valid при сбросе.
Задание
СреднеРеализуйте конвейер с двумя стадиями на регистрах. На каждом фронте, если не выполняется сброс, первая стадия захватывает a и in_valid. Вторая стадия использует предыдущие значения первой стадии: out_valid становится её старым значением valid, а y становится её старыми данными плюс единица по модулю 256, если valid имеет значение true, иначе — нулём. Синхронный rst очищает обе стадии и выходы. Столбцы вывода: y, out_valid. Все управляющие сигналы и данные стабильны перед каждым восходящим фронтом тактового сигнала; результаты наблюдаются после него.
Заполните design.v, сохранив имена его модулей и порты. Заблокированный testbench.v подаёт изменения входных данных и выводит выходы после их стабилизации. Он выбирает сценарий с помощью аргумента симулятора, например +CASE=1; стандартный ввод не требуется. Не добавляйте в проект вывод, задержки или завершение симуляции. Ожидаемый вывод — одна строка десятичных значений для каждого наблюдения, разделённых одним пробелом и заканчивающихся символом новой строки.
Попробуйте сами
module dut (input clk, input rst, input in_valid, input [7:0] a, output reg [7:0] y, output reg out_valid);
// Замените этот заполнитель своим дизайном.
initial y = 0;
initial out_valid = 0;
endmoduleВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Проектирование и верификация RTL
1Надёжная комбинационная RTL-логика
Значения по умолчанию предотвращают защёлкиПриоритетные кодировщикиПроверка One-HotБезопасное декодирование caseПовторение — маршрутизатор запросов4Управляемая последовательная RTL-логика
Приоритет сброса и разрешенияСчётчики с насыщениемКонвейеризация данных и validОбнаружение дискретизированных фронтовПовторение — счётчик событий2Разрядности и знаковая арифметика
Сохранение битов переносаСравнения знаковых чиселАрифметические сдвиги вправоПереполнение и насыщениеПовторение — знаковая разностьПотренируйтесь самостоятельно: Онлайн-компилятор Verilog