У меня есть модуль, в котором я хочу выполнить умножение матриц (для матриц 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?