Menu
Coddy logo textTech

Конвейеризация данных и 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 при сбросе.

challenge icon

Задание

Средне

Реализуйте конвейер с двумя стадиями на регистрах. На каждом фронте, если не выполняется сброс, первая стадия захватывает 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Проектирование и верификация RTL

Потренируйтесь самостоятельно: Онлайн-компилятор Verilog