Параметризуемый модуль умножения квадратных матриц на SystemVerilog, реализованный как последовательный конечный автомат с операцией multiply-accumulate для вычисления элементов результирующей матрицы.
Модуль matrix_multiplier выполняет умножение двух квадратных матриц A и B размером SIZE_MATRIX x SIZE_MATRIX и формирует результирующую матрицу C.
Вычисление выполняется последовательно, поэлементно:
- выбирается текущая ячейка
C[i][j] - выполняется накопление суммы произведений
A[i][k] * B[k][j] - результат сохраняется
- автомат переходит к следующей ячейке
После завершения вычислений модуль формирует сигнал done.
- параметризуемый размер матрицы
- параметризуемая разрядность элементов
- последовательное вычисление через конечный автомат
- использование промежуточного аккумулятора
- отдельный сигнал завершения вычисления
done - асинхронный сброс
- синхронная работа по фронту
clk
SIZE_MATRIX— размер квадратной матрицыWIDTH— разрядность элементов входных матрицWIDTH_C— разрядность элементов выходной матрицы
По умолчанию:
parameter SIZE_MATRIX = 4;
parameter WIDTH = 8;
parameter WIDTH_C = 4 + WIDTH;clk— тактовый сигналrst— асинхронный сброс, активный низким уровнемstart— запуск вычисленияA— входная матрицаAB— входная матрицаB
done— сигнал завершения вычисленияC— результирующая матрица
Входные и выходные матрицы заданы как двумерные массивы:
input logic [WIDTH-1:0] A [0:SIZE_MATRIX-1][0:SIZE_MATRIX-1];
input logic [WIDTH-1:0] B [0:SIZE_MATRIX-1][0:SIZE_MATRIX-1];
output logic [WIDTH_C-1:0] C [0:SIZE_MATRIX-1][0:SIZE_MATRIX-1];После сброса модуль переходит в начальное состояние и ожидает сигнал start.
После запуска:
- обнуляются внутренние регистры и индексы
- выбирается текущая ячейка результата
C[i][j] - по индексу
kвыполняется накопление:
C[i][j] = Σ A[i][k] * B[k][j]
- готовое значение сохраняется
- автомат переходит к следующей ячейке
- после вычисления всей матрицы формируется
done
Во время вычисления итоговая матрица сначала записывается во внутренний буфер, а затем переносится на выход C.
В модуле используются следующие состояния:
starting— ожидание сигналаstartmac— выполнение операций умножения и накопленияstore_cell— сохранение результата текущей ячейкиnext_cell— переход к следующей ячейке матрицыexit— перенос результата на выход и установкаdoneSTOP— завершение цикла и возврат в ожидание
Для вычисления результата используются три индекса:
i— номер строки результатаj— номер столбца результатаk— индекс суммирования
Порядок работы:
- фиксируются
iиj - по
kвычисляется сумма произведений - после завершения суммирования сохраняется
C[i][j] - затем увеличивается
j - после завершения строки увеличивается
i
- сигнал
doneформируется после завершения полного вычисления матрицы - выходная матрица
Cобновляется в конце вычисления - новый запуск должен выполняться из состояния ожидания
- параметр
WIDTH_Cнеобходимо выбирать с запасом, чтобы результат умножения и последующего суммирования не переполнялся
Дальше проект можно расширить:
- добавить проверку на нескольких наборах матриц
- сохранить waveform для README
- реализовать более производительную конвейерную или систолическую архитектуру
- добавить интерфейс
valid/readyдля потоковой подачи данных
Такой модуль можно использовать как учебный пример для изучения:
- умножения матриц в RTL
- конечных автоматов в
SystemVerilog - последовательных вычислительных блоков
- организации вложенных индексов в аппаратном описании
- проектирования простых вычислительных ускорителей