CRC32 on-the-fly from c_buf (bypass GCC volatile ExtRAM bug)

This commit is contained in:
2026-06-25 01:19:57 +08:00
parent 292d3c7abf
commit 31c2b53583

View File

@@ -155,6 +155,7 @@ int main(void)
/* ── Start marker (must be first output) ──────────────────── */ /* ── Start marker (must be first output) ──────────────────── */
printf("MATMUL_START\n"); printf("MATMUL_START\n");
crc = 0xFFFFFFFF;
/* ── Prologue: Load and Start the very first group ────────── */ /* ── Prologue: Load and Start the very first group ────────── */
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
@@ -191,15 +192,13 @@ int main(void)
// 4. Read the PREVIOUS group's result and write to memory // 4. Read the PREVIOUS group's result and write to memory
read_ip(bank_C[prev_bank], c_buf, 48); read_ip(bank_C[prev_bank], c_buf, 48);
// Required DBG prints logic modified to match the pipelined flow
if (finished_g == 1) {
printf("DBG C[0..2]=%08lx %08lx %08lx\n",
(unsigned long)c_buf[0], (unsigned long)c_buf[1], (unsigned long)c_buf[2]);
}
for (i = 0; i < 48; i++) { for (i = 0; i < 48; i++) {
extram[DST_BASE + finished_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 + finished_g * 48 + i] = w;
} }
if (finished_g == 0) { if (finished_g == 0) {
@@ -212,11 +211,16 @@ int main(void)
wait_and_clear_done(); wait_and_clear_done();
read_ip(bank_C[cur_bank], c_buf, 48); read_ip(bank_C[cur_bank], c_buf, 48);
for (i = 0; i < 48; i++) { for (i = 0; i < 48; i++) {
extram[DST_BASE + (MATMUL_GROUP_NUM - 1) * 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 + (MATMUL_GROUP_NUM - 1) * 48 + i] = w;
} }
/* ── CRC32 over result region ─────────────────────────────── */ /* ── Finalize CRC32 ──────────────────────────────────────── */
crc = compute_crc32(extram); crc ^= 0xFFFFFFFF;
/* ── Final markers ────────────────────────────────────────── */ /* ── Final markers ────────────────────────────────────────── */
printf("MATMUL_CRC32=%08lx\n", (unsigned long)crc); printf("MATMUL_CRC32=%08lx\n", (unsigned long)crc);