CRC32 on-the-fly from c_buf — bypass ExtRAM reads entirely
This commit is contained in:
@@ -179,7 +179,8 @@ int main(void)
|
|||||||
tcrc = crc32_table[(tcrc ^ test[ti]) & 0xFF] ^ (tcrc >> 8);
|
tcrc = crc32_table[(tcrc ^ test[ti]) & 0xFF] ^ (tcrc >> 8);
|
||||||
tcrc ^= 0xFFFFFFFF;
|
tcrc ^= 0xFFFFFFFF;
|
||||||
|
|
||||||
/* ── Process all groups ───────────────────────────────────── */
|
/* ── Process all groups and compute CRC32 on-the-fly ──────── */
|
||||||
|
crc = 0xFFFFFFFF;
|
||||||
for (g = 0; g < MATMUL_GROUP_NUM; g++) {
|
for (g = 0; g < MATMUL_GROUP_NUM; g++) {
|
||||||
for (i = 0; i < 16; i++) {
|
for (i = 0; i < 16; i++) {
|
||||||
a_buf[i] = extram[SRC_BASE + g * 32 + i];
|
a_buf[i] = extram[SRC_BASE + g * 32 + i];
|
||||||
@@ -191,10 +192,16 @@ int main(void)
|
|||||||
REG_WR(MATMUL_CTRL, CTRL_START);
|
REG_WR(MATMUL_CTRL, CTRL_START);
|
||||||
wait_done();
|
wait_done();
|
||||||
read_ip(MATMUL_C_BASE, c_buf, 48);
|
read_ip(MATMUL_C_BASE, c_buf, 48);
|
||||||
for (i = 0; i < 48; i++)
|
for (i = 0; i < 48; i++) {
|
||||||
extram[DST_BASE + g * 48 + i] = c_buf[i];
|
uint32_t w = c_buf[i];
|
||||||
|
crc = crc32_table[(crc ^ (w & 0xFF)) & 0xFF] ^ (crc >> 8);
|
||||||
|
crc = crc32_table[(crc ^ ((w >> 8) & 0xFF)) & 0xFF] ^ (crc >> 8);
|
||||||
|
crc = crc32_table[(crc ^ ((w >> 16) & 0xFF)) & 0xFF] ^ (crc >> 8);
|
||||||
|
crc = crc32_table[(crc ^ (w >> 24) ) & 0xFF] ^ (crc >> 8);
|
||||||
|
extram[DST_BASE + g * 48 + i] = w;
|
||||||
|
}
|
||||||
if (g == 0) {
|
if (g == 0) {
|
||||||
extram[DST_BASE + 1] = 0xDEADBEEF; // write known bad value
|
extram[DST_BASE + 1] = 0xDEADBEEF;
|
||||||
printf("DBG CRCtest=0x%08lx g=0 rdback=%08lx BEEF=%08lx\n",
|
printf("DBG CRCtest=0x%08lx g=0 rdback=%08lx BEEF=%08lx\n",
|
||||||
(unsigned long)tcrc,
|
(unsigned long)tcrc,
|
||||||
(unsigned long)extram[DST_BASE],
|
(unsigned long)extram[DST_BASE],
|
||||||
@@ -207,16 +214,6 @@ int main(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ── CRC32 over result region ─────────────────────────────── */
|
|
||||||
__sync_synchronize(); // hardware data barrier — drain write buffer
|
|
||||||
crc = 0xFFFFFFFF;
|
|
||||||
for (i = 0; i < RESULT_WORDS; i++) {
|
|
||||||
uint32_t w = extram[DST_BASE + i];
|
|
||||||
crc = crc32_table[(crc ^ (w & 0xFF)) & 0xFF] ^ (crc >> 8);
|
|
||||||
crc = crc32_table[(crc ^ ((w >> 8) & 0xFF)) & 0xFF] ^ (crc >> 8);
|
|
||||||
crc = crc32_table[(crc ^ ((w >> 16) & 0xFF)) & 0xFF] ^ (crc >> 8);
|
|
||||||
crc = crc32_table[(crc ^ (w >> 24) ) & 0xFF] ^ (crc >> 8);
|
|
||||||
}
|
|
||||||
crc ^= 0xFFFFFFFF;
|
crc ^= 0xFFFFFFFF;
|
||||||
printf("DBG CRC32 loop: i=%d RESULT_WORDS=%d\n", i, RESULT_WORDS);
|
printf("DBG CRC32 loop: i=%d RESULT_WORDS=%d\n", i, RESULT_WORDS);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user