RTL-эмулятор eMMC на Kintex UltraScale загрузил Linux с образа в DDR4
Дмитрий Абрамов из Positive Technologies описал проект eMMC-emu: реализацию ведомого устройства eMMC в FPGA AMD Kintex UltraScale XCKU060. Такая схема позволяет подменять содержимое накопителя во время эксперимента, задерживать отдельные ответы и воспроизводить пограничные состояния протокола. Обычный host-controller IP здесь неприменим, поскольку FPGA должна вести себя как сама микросхема памяти.
RTL разделён на командный и информационный тракты. Командный автомат принимает кадры по линии CMD, проверяет CRC7, декодирует индекс команды и формирует ответ нужного типа. Информационный тракт обслуживает шину DAT, считает отдельный CRC16 для каждой линии и управляет направлением двунаправленных IOBUF. В исходной статье для полинома CRC16 указано 0x1051, хотя выражению x^16+x^12+x^5+1 соответствует распространённая запись 0x1021; для воспроизведения проекта это место потребует проверки по RTL или осциллограммам.
Образ накопителя хранится в 4 ГБ DDR4, подключённой через MIG. Один сектор eMMC объёмом 512 байт переносится AXI-бёрстом из 128 слов по 32 бита. Логика eMMC тактируется сигналом emmc_clk, который приходит от исследуемого хоста, тогда как MIG и AXI работают в собственном домене. Переход между ними выполнен через асинхронные FIFO. Такое разделение убирает прямую временную зависимость DDR4 от такта хоста, но добавляет задержку и требует заранее поддерживать достаточный запас данных для непрерывной выдачи сектора.
В качестве эталона использовалась Samsung KLM4G1FETE-B041 ёмкостью 4 ГБ. Это eMMC 5.1 с шиной шириной 1, 4 или 8 бит, напряжением ввода-вывода 1.8 либо 3.3 В и частотой до 200 МГц. Испытуемым хостом стала Orange Pi 3B на Rockchip RK3566 со сменным модулем eMMC. Автор сообщает об успешной загрузке ядра Linux на 52 МГц и достижении режима HS200.
HS200 передаёт данные в SDR на частоте до 200 МГц. При ширине 8 бит предельная сырая скорость равна 200 МБ/с. Интервал одного такта составляет 5 нс, поэтому результат определяется задержками IOBUF, разводкой переходной платы, skew линий CMD и DAT, джиттером emmc_clk и положением окна выборки. Документация AMD отдельно указывает на жёсткое согласование задержек для HS200. Kintex UltraScale допускает работу нужных банков при 1.8 В, однако одного соответствия уровней для устойчивого обмена недостаточно.
Отдельный эпизод отладки связан с тайм-аутами на 26 МГц. Похожий сбой появился и с настоящей eMMC после принудительного ограничения частоты, что позволило автору связать эффект с трактом SDHCI в RK3566 или используемом U-Boot. Это полезное свойство активного эмулятора: он даёт менять временное поведение устройства и отделять ошибку контроллера хоста от дефекта RTL.
Разработчик также заявляет, что управляемая подмена данных позволила использовать TOCTOU-уязвимость RK3566 и обойти Secure Boot. Техническое описание атаки отложено до следующей публикации, поэтому оценить модель угроз, версии загрузочной цепочки и воспроизводимость результата пока нельзя. Исходники RTL, constraints, отчёты timing closure, eye diagram и длительные тесты на 200 МГц также отсутствуют в открытом доступе. Проект уже подтверждает ценность FPGA-эмуляции при загрузке ОС и исследовании протокола; заявленная устойчивость HS200 требует измерений на физическом интерфейсе.