Разработчик под ником demid735 опубликовал MVP проекта hw-mlir-lab, который демонстрирует end-to-end пайплайн от операции умножения матриц на уровне компилятора MLIR до симуляции на RTL-модели аппаратного ускорителя. Основная цель проекта — связать две области, которые часто существуют изолированно: разработку компиляторов и проектирование аппаратуры. В современных системах-на-кристалле (SoC) всё больше вычислительных задач передаётся на специализированные блоки-ускорители для ИИ, связи, DSP и других направлений. При этом эффективность таких блоков зависит не только от их микроархитектуры, но и от того, как компилятор и runtime решают, какие операции отправлять на ускоритель. Возникает разрыв: аппаратная команда смотрит на RTL, интерфейсы и тайминги, а софтверная — на компилятор и API. Проект hw-mlir-lab призван показать, как можно преодолеть этот разрыв на небольшом примере.

В текущем MVP реализована одна конкретная вертикаль: операция linalg.matmul из MLIR преобразуется под фиксированный systolic array размером 8×8. Пайплайн разбит на несколько этапов. Сначала MLIR transform pipeline разбивает матричное умножение на тайлы 8×8 и применяет padding для граничных случаев. Затем подходящие операции заменяются на custom MLIR операцию standalone.systolic_matmul — явную метку, что данный фрагмент должен выполняться на внешнем аппаратном блоке. После lowering до C ABI вызов превращается в функцию systolic_matmul_8x8(...). Сейчас за этой функцией стоит simulation bridge, передающий данные в cocotb testbench через Unix socket. Cocotb подаёт данные на SystemVerilog-модуль systolic array в Verilator, ждёт завершения вычисления и возвращает результат.

УровеньОписание
MLIR levelПредставление и трансформация вычислений с помощью MLIR; операция linalg.matmul преобразуется в custom операцию standalone.systolic_matmul.
C ABI levelГраница между сгенерированным кодом и вызовом ускорителя; функция systolic_matmul_8x8(...) через Unix socket передаёт данные в симулятор.
RTL levelВыполнение операции на аппаратной модели: SystemVerilog-модуль systolic array симулируется в Verilator, управляется из cocotb.

Автор подчёркивает, что проект разделён на три уровня: MLIR level (представление и трансформация), C ABI level (граница между сгенерированным кодом и вызовом ускорителя) и RTL level (выполнение операции на модели аппаратного блока). Такое разделение позволяет в будущем заменять симуляцию на другие runtime-механизмы — MMIO, DMA, драйвер FPGA или интерфейс к реальному ASIC. Проект использует standalone-opt — расширение стандартного примера out-of-tree dialect из MLIR. В дальнейшем автор планирует развивать hw-mlir-lab в открытый фреймворк для прототипирования ускорительных подсистем с библиотекой MLIR passes, IP-блоков, runtime-интерфейсов и интеграцией с CIRCT. Проект будет полезен инженерам, работающим на стыке компиляторов и цифровой схемотехники, и может стать базой для изучения сквозных пайплайнов для аппаратных ускорителей.

В MVP реализован сквозной flow: linalg.matmul разбивается на тайлы 8×8, преобразуется в custom MLIR операцию и через C ABI выполняется на Verilator-симуляции.