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 = 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);