Skip to content
ПЛИС II: АЛУ и тракт данных

ПЛИС II: АЛУ и регистры в Verilog

Паспорт модуля

ПараметрЗначение
Аудитория🔴 (🟡 по готовности); пройдены М4, М15
Аутентичная задачаполучить верифицированные HDL-двойники узлов машины — строительные блоки процессора М17
Объём4 занятия × 90 мин
ОборудованиеTang Primer 25K, Icarus+GTKWave, эталонные векторы с макетки М4 (снятые RP2350)
Ограничениякак в М15
Аутентичная задача. После модуля обучающиеся смогут: доказать эквивалентность своего HDL-АЛУ и макеточного АЛУ на общем наборе векторов — инженерная практика кросс-верификации в миниатюре.

Цели

Обучающиеся …Блум—АндерсонМиллерПроверка
1описывают АЛУ (ADD/SUB, флаги C, Z) комбинационноприменять/создаватьделаетсамопроверяющийся тестбенч: 0 ошибок на полном переборе
2описывают регистр с load-enable и шинную мультиплексию (вместо three-state — MUX: почему?)понимать/применятьпоказывает кактестбенч тракта
3проводят кросс-верификацию HDL ↔ макетка по эталонным вектораманализироватьпоказывает какпротокол сверки
4читают отчёт синтеза и объясняют, во что превратился их коданализироватьзнает какразбор отчёта на мини-защите

Ядро модуля (worked examples)

АЛУ — «те же 20 строк, что 5 корпусов М4»:

module alu (
    input  wire [7:0] a, b,
    input  wire       sub,        // тот же сигнал SU, что в микрокоде
    output wire [7:0] y,
    output wire       cf, zf
);
    wire [7:0] bx = b ^ {8{sub}};       // линейка XOR = 74HC86 из М4
    wire [8:0] s  = {1'b0,a} + {1'b0,bx} + sub;  // sub идёт в Cin — узнаёте?
    assign y  = s[7:0];
    assign cf = s[8];
    assign zf = (y == 8'd0);            // ИЛИ-НЕ по выходам из М4
endmodule

Самопроверяющийся тестбенч — полный перебор (на макетке невозможный, здесь — секунды):

initial begin
    for (integer i=0;i<256;i=i+1) for (integer j=0;j<256;j=j+1) begin
        a=i; b=j; sub=0; #1;
        if ({cf,y} !== (i+j))      begin $display("FAIL ADD %0d+%0d",i,j); errors=errors+1; end
        sub=1; #1;
        if (y !== ((i-j)&8'hFF))   begin $display("FAIL SUB %0d-%0d",i,j); errors=errors+1; end
    end
    $display(errors ? "FAILED" : "ALL 131072 vectors OK"); $finish;
end
Почему в ПЛИС нет three-state шины: внутренняя трёхстабильная логика в современных ПЛИС не реализуется — синтезатор превращает «шину» в мультиплексоры. Обсудить честно: дисциплина «один говорит» из М7 никуда не делась, она стала селектором MUX. Одна и та же архитектурная идея — разные физические носители; это и есть переносимое знание.

Оценивание

Итог: (1) полный перебор АЛУ — 0 ошибок; (2) кросс-верификация: 32 эталонных вектора, снятых RP2350 с макетки М4, прогнаны через HDL — расхождений нет, либо расхождение исследовано и объяснено письменно (чаще всего это поведение C при SUB — третья встреча с этим сюжетом после М4 и М14: запланированный интервальный возврат); (3) разбор отчёта синтеза: сколько LUT занял АЛУ, нашёл ли синтезатор аппаратный сумматор.

Типичные ошибки: сравнение в тестбенче через == вместо !== — иксы (x) «проходят» проверку; ширины: a+b без 9-го бита молча теряет перенос; смешение блокирующих/неблокирующих в одном блоке; вывод «на плате не проверял, в симуляторе же работает» — маршрут курса требует и волн, и платы (АЛУ на кнопках дока: 4 бита A с DIP, результат на светодиодах).

Уровни

Глоссарий