CRC32 on-the-fly from c_buf — bypass ExtRAM reads entirely

This commit is contained in:
2026-06-24 23:38:06 +08:00
parent 07f8422d75
commit c1fcb3c796

View File

@@ -179,7 +179,8 @@ int main(void)
tcrc = crc32_table[(tcrc ^ test[ti]) & 0xFF] ^ (tcrc >> 8);
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 (i = 0; i < 16; i++) {
a_buf[i] = extram[SRC_BASE + g * 32 + i];
@@ -191,10 +192,16 @@ int main(void)
REG_WR(MATMUL_CTRL, CTRL_START);
wait_done();
read_ip(MATMUL_C_BASE, c_buf, 48);
for (i = 0; i < 48; i++)
extram[DST_BASE + g * 48 + i] = c_buf[i];
for (i = 0; i < 48; 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) {
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",
(unsigned long)tcrc,
(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;
printf("DBG CRC32 loop: i=%d RESULT_WORDS=%d\n", i, RESULT_WORDS);