ПЛИС 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, результат на светодиодах).Уровни
АЛУ + регистр с enable, полный перебор, демонстрация на плате.
Флаг переполнения V и знаковое сравнение; параметризация ширины (8→16 бит одним параметром — невозможная на макетке роскошь, отрефлексировать); оценка максимальной частоты АЛУ по отчёту тайминга и связь с расчётом задержек из М3.