From c1fcb3c796445caed0ef19948d8afe87b65e7175 Mon Sep 17 00:00:00 2001 From: FallenSigh Date: Wed, 24 Jun 2026 23:38:06 +0800 Subject: [PATCH] =?UTF-8?q?CRC32=20on-the-fly=20from=20c=5Fbuf=20=E2=80=94?= =?UTF-8?q?=20bypass=20ExtRAM=20reads=20entirely?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sdk/software/examples/asm/user-sample.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/sdk/software/examples/asm/user-sample.c b/sdk/software/examples/asm/user-sample.c index e8e1062..26cf858 100644 --- a/sdk/software/examples/asm/user-sample.c +++ b/sdk/software/examples/asm/user-sample.c @@ -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);