z386 догнал ao486: open‑source 80386 на FPGA получил early start memory access
FPGA-ядро z386 подняло производительность Doom с 16.6 до 23.0 FPS на DE10-Nano, сохранив частоту 85 МГц. В основе прироста лежит Early Start: адрес следующего обращения к памяти начинает вычисляться ещё в завершающем такте предыдущей инструкции. Реализация потребовала обойти зависимости регистров и воспроизвести неоднозначность POPAD, характерную для 386DX.
Открытое SystemVerilog-ядро z386 получило Early Start Memory Access — конвейерный механизм, применявшийся в оригинальном Intel 80386. После серии доработок автор проекта заявляет 23.0 FPS в Doom вместо 16.6 FPS и 44.5 балла в 3DBench вместо 33.7 при той же частоте 85 МГц на плате DE10-Nano. Эти результаты опубликованы автором проекта; подробная методика с фиксированным demo loop, конфигурацией памяти и способом подсчёта кадров пока отсутствует.
Early Start сокращает простой тракта памяти между инструкциями. Обычный путь для memory-инструкции включает вычисление effective address, сегментную трансляцию, проверку страничной адресации и TLB, затем запрос в кэш или внешнюю память. В новой реализации адресная часть следующей инструкции запускается в последнем такте текущей. Пока предыдущая операция завершает запись или чтение, блок calc_ea_core уже формирует адрес следующего доступа и готовит запрос.
Такое перекрытие упирается в зависимости данных. Следующая инструкция может использовать GPR или ESP, изменённый непосредственно перед ней, а запись в регистровый файл ещё не успевает стать видимой на обычном порте чтения. В z386 добавлен bypass: сеть fwd_onehot_gpr выбирает результат из поздних стадий конвейера и подаёт его на вычислитель адреса. Отдельно разобраны частичные обновления AL, AX и EAX, где ширина и положение записываемого фрагмента определяют, какие биты должны прийти из forwarding-пути, а какие — из прежнего значения регистра.
Этот участок RTL оказался связан с известной особенностью POPAD на 386DX. Инструкция восстанавливает набор регистров из стека и пропускает слот ESP, однако раннее вычисление адреса последующих операций способно столкнуться с промежуточными значениями. Автор связывает обработку corner case с наблюдаемым историческим поведением процессора. Для строгого совпадения с физическим 386DX потребовались бы открытые тестовые векторы либо аппаратное сравнение, поэтому речь пока идёт о технической реконструкции, а не о доказанной полной идентичности.
Early Start входит в более широкий набор изменений. В ядре очищена очередь store, запросы чтения и записи начинают формироваться на ранней стадии i_first, относительные переходы получают ранний redirect. Добавлены раздельные физически индексируемые L1-кэши объёмом 16+16 КБ для инструкций и данных, расширен frontend. Поэтому весь прирост Doom и 3DBench нельзя приписывать одному механизму: историческая оценка вклада Early Start для 80386 составляет около 9%, а остальная разница определяется кэшами, ветвлениями и пропускной способностью тракта памяти.
Сравнение с ao486 остаётся тестозависимым. В опубликованной таблице z386 опережает ao486 в Doom — 23.0 против 21.0 FPS — и 3DBench — 44.5 против 43.8, хотя ao486 работает на 90 МГц. В Landmark преимущество остаётся за ao486: 204 против 170. Совместимость также далека от завершения: Windows на z386 пока не загружается. Проект тем ценнее как доступная реализация позднего 16/32-разрядного x86-конвейера, где микропроцессорные приёмы можно изучать на уровне синтезируемого RTL, кэшей, TLB и арбитража памяти.