Una de las formas "agradables" de aplanar una matriz es elegir un tamaño de matriz donde las longitudes de los bordes sean potencias de 2. Por ejemplo, tiene tamaños de 108 y 28 bits. Si redondea esos hasta 128 y 32 bits, entonces puede concatenar las direcciones de bits para obtener una matriz "plana".
Por ejemplo, digamos que x es la dirección de 32 bits e y es la dirección de 128 bits,
square[x][y]
se asigna a flat[x + y << 32]
Para resolver esto en verilog, puede recorrer xey de forma anidada, y su nueva dirección de datos planos es {x, y} o {y, x} dependiendo de si desea que sus datos sean en filas o columna-sabio.
El otro lado es solo una cuestión de revertir el proceso. Es trivial rellenar los datos con ceros cuando sea necesario, y parece que estás haciendo algo de relleno en cualquier caso porque las longitudes de tus filas no son las mismas.