Как преобразовать векторный ввод в матрицу в Verilog - PullRequest
0 голосов
/ 04 марта 2020

У меня есть модуль, в котором я хочу выполнить умножение матриц (для матриц 5x32 и 32x5). Поскольку Verilog не поддерживает распакованные массивы в качестве входных данных, я решил передать плоские векторы и преобразовать их в массив самостоятельно. Для небольших матриц я бы сделал следующее:

reg [31:0] A1 [0:1][0:1]; // for 2x2 matrix
{A1[0][0],A1[0][1],A1[1][0],A1[1][1]} = A;

Но я имею дело с матрицами большего размера, так что это не вариант, я также попытался использовать циклы, но приведенный ниже код дал ошибку, сообщив, что start переменная должна быть постоянной.

module matmul(input [4960:0] A, input [4960:0] B, output reg [800:0] out);
    integer i,j,k;
    parameter WIDTH = 32, LENGTH = 5;
    initial out = 0;

    reg [31:0] placeholder_A [4:0][31:0];
    reg [31:0] placeholder_B [31:0][4:0];
    reg [31:0] placeholder_out [4:0][4:0];

    always @(*) begin
        // turn flat vector A array into matrix
        for (i=0; i<5; i=i+1)
            for(j=0; j<32; j=j+1) begin
                placeholder_A[i][j] = A[start+31:start];
                start = start + 32;
            end
        start = 0;
        end
endmodule

Какой лучший способ сделать то, что я пытаюсь сделать sh?

...