void gemm_bring_up(void)
{
unsigned int i, j;
uint32_t uram_data;
unsigned int waddr;
printf("Writing into registers\n");
// 1. Write to Control register with Address autoincrement bit set to 1
// Write to address 0x10 data = 0x2
xrtKernelWriteRegister(gemm_top_khdl, 0x10, 0x2);
// 2. Write to Indirect address register value of 0
// Write to address 0x1C, data = 0
xrtKernelWriteRegister(gemm_top_khdl, 0x1C, 0x0);
// 3. Write to indirect address control register, Valid bit = 1, R/W## = 0
// Write to address 0x18 data = 0x1
xrtKernelWriteRegister(gemm_top_khdl, 0x18, 0x1);
// Write 16 32x32 A Matrices into Row URAMs at adress 0x20
// Size of each Matrix is 2KB, total size = 32KB
// Data is arrangde in 32-bit wide entry (4Byte)
// So total lines = 8K
printf("Writing Matrix A\n");
waddr = 0;
for (i=0; i<NUM_ROW_URAM; i=i+1) { // Only 8 URAMs are populated
for (j=0; j<(MATRIX_A_SIZE/NUM_ROW_URAM); j=j+1) { // 1024 locations written to 8 URAMs
uram_data = matrix_A_data[MATRIX_A_SIZE/NUM_COL_URAM*i+j];
xrtKernelWriteRegister (gemm_top_khdl, 0x20, uram_data);
}
// Increment the address
waddr += 0x8000;
xrtKernelWriteRegister (gemm_top_khdl, 0x1c, waddr);
}
waddr = 0x200000;
xrtKernelWriteRegister (gemm_top_khdl, 0x1c, waddr);
printf("Writing Matrix B\n");
for (i=0; i<NUM_COL_URAM; i=i+1) { // Only 8 URAMs are populated
for (j=0; j<(MATRIX_B_SIZE/NUM_COL_URAM); j=j+1) { // 1024 locations written to 8 URAMs
uram_data = matrix_B_data[MATRIX_B_SIZE/NUM_COL_URAM*i+j];
xrtKernelWriteRegister (gemm_top_khdl, 0x20, uram_data);
}
// Increment the address
waddr += 0x8000;
xrtKernelWriteRegister (gemm_top_khdl, 0x1c, waddr);
}
// Set DUT Enable bit
// Write to address 0x10, data = 0x3
xrtKernelWriteRegister (gemm_top_khdl, 0x10, 0x3);
}