Регистрация | Вход
void matrix_multiply_c(float32_t *A, float32_t *B, float32_t *C, uint32_t n, uint32_t m, uint32_t k) { for (int i_idx=0; i_idx < n; i_idx++) { for (int j_idx=0; j_idx < m; j_idx++) { C[n*j_idx + i_idx] = 0; for (int k_idx=0; k_idx < k; k_idx++) { C[n*j_idx + i_idx] += A[n*k_idx + i_idx]*B[k*j_idx + k_idx]; } } }}
Сvoid matrix_multiplier( int *A, int *B, int *C, int MATRIX_SIZE) { for (int i = 0; i < MATRIX_SIZE; i++) { for (int j = 0; j < MATRIX_SIZE; j++) { int temp_sum = 0; for (int k = 0; k < MATRIX_SIZE; k++) { temp_sum += A[i * MATRIX_SIZE + k] * B[k * MATRIX_SIZE + j]; } C[i * MATRIX_SIZE + j] = temp_sum; } }}
verilogmodule matrix_multiplier #( parameter DATA_WIDTH = 8, parameter MATRIX_SIZE = 4) ( input wire [DATA_WIDTH * MATRIX_SIZE * MATRIX_SIZE - 1 : 0] A, input wire [DATA_WIDTH * MATRIX_SIZE * MATRIX_SIZE - 1 : 0] B, output reg [DATA_WIDTH * 2 * MATRIX_SIZE * MATRIX_SIZE - 1 : 0] C); integer i, j, k; reg [DATA_WIDTH * 2 - 1 : 0] temp_sum; always @(*) begin for (i = 0; i < MATRIX_SIZE; i = i + 1) begin for (j = 0; j < MATRIX_SIZE; j = j + 1) begin temp_sum = 0; for (k = 0; k < MATRIX_SIZE; k = k + 1) begin temp_sum = temp_sum + A[(i * MATRIX_SIZE + k) * DATA_WIDTH +: DATA_WIDTH] * B[(k * MATRIX_SIZE + j) * DATA_WIDTH +: DATA_WIDTH]; end C[(i * MATRIX_SIZE + j) * DATA_WIDTH * 2 +: DATA_WIDTH * 2] <= temp_sum; end end endendmodule