From e7261c7281a9b1d87ae123094963aea91a2582f6 Mon Sep 17 00:00:00 2001 From: Ron Jokai Date: Fri, 9 Jan 2026 22:00:15 -0600 Subject: [PATCH 1/7] [Hex code] Clarifying some comments. --- sw/fir.hex.comm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sw/fir.hex.comm b/sw/fir.hex.comm index 0e1b189..1f7fd75 100644 --- a/sw/fir.hex.comm +++ b/sw/fir.hex.comm @@ -1,7 +1,7 @@ 000010b7 x1 = 0x0000_1000 (SRC) 00002137 x2 = 0x0000_2000 (DST) 400002b7 x5 = 0x4000_0000 (MMIO base) -04900193 x3 = 73 (N = 73 CGRA packets. 3 beats per packet for 64b AXI bandwidth. CGRA packets set from here, beats per packet set by parameters.) +04900193 x3 = 73 (CGRA receives N = 73 CGRA packets. 3 beats per packet for 64b AXI bandwidth. CGRA packets set from here, beats per packet set by RTL parameters.) 01800213 x4 = 24 (packet stride) ... 111103b7 lui x7 @@ -31,13 +31,13 @@ addi 31 add 10 10 31 00a0b823 sd x10, 16(x1) -01808093 Advance x1 += 24 (h1018) +01808093 Advance x1 += 24 (abs addr h1018 after the first iteration) ... 000010b7 x1 = 0x0000_1000 (SRC) 0012b423 SD x1, 8(x5) - SRC_RX 0022b823 SD x2, 16(x5) - DST_TX 0032bc23 SD x3, 24(x5) - LEN_RX -00100193 x3 = 1 (N = 1 CGRA packet. 3 beats per packet for 64b AXI bandwidth. CGRA packets set from here, beats per packet set by parameters.) +00100193 x3 = 1 (CGRA sends back N = 1 CGRA packet. 3 beats per packet for 64b AXI bandwidth. CGRA packets set from here, beats per packet set by RTL parameters.) 0032be23 SD x3, 28(x5) - LEN_TX 00300313 x6 = 3 00a00413 ADDI x8, x0, 0x0A From 9385e6863d42348c672c0f70fce80e376eb52f56 Mon Sep 17 00:00:00 2001 From: Ron Jokai Date: Fri, 9 Jan 2026 22:04:50 -0600 Subject: [PATCH 2/7] [Hex code] Initial commit of FIR vector global reduce RISC-V code. --- sw/fir_vector_global_reduce.hex | 4045 +++++++++++++++++++++++++++++++ 1 file changed, 4045 insertions(+) create mode 100644 sw/fir_vector_global_reduce.hex diff --git a/sw/fir_vector_global_reduce.hex b/sw/fir_vector_global_reduce.hex new file mode 100644 index 0000000..39e5077 --- /dev/null +++ b/sw/fir_vector_global_reduce.hex @@ -0,0 +1,4045 @@ +000010b7 +00002137 +400002b7 +07a00193 +02000213 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +18000537 +20050513 +01051513 +01051513 +02000fb7 +200f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +03008437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +18000537 +20050513 +01051513 +01051513 +02000fb7 +200f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +19010437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +18002537 +e0050513 +01051513 +01051513 +1c002fb7 +a00f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +21018437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +18002537 +60050513 +01051513 +01051513 +24002fb7 +200f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +1d020437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +18002537 +20050513 +01051513 +01051513 +20002fb7 +e00f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +25028437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +18003537 +a0050513 +01051513 +01051513 +28002fb7 +600f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +03030437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +18000537 +20050513 +01051513 +01051513 +02000fb7 +200f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +07000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +1a000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +09000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +10000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +4d000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0e000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +140003b7 +20038393 +01039393 +01039393 +00200fb7 +000f8f93 +01f383b3 +0070b023 +00005437 +e8d40413 +01041413 +01041413 +10010fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +400013b7 +80038393 +01039393 +01039393 +00100fb7 +001f8f93 +01f383b3 +0070b023 +00002437 +08d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +002f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +003f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +05000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +22000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +08000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0c000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0a000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +00000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00000fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +09000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +10000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00008fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +4d000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0e000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00008fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00008fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +100003b7 +20038393 +01039393 +01039393 +00000fb7 +001f8f93 +01f383b3 +0070b023 +00001437 +08d40413 +01041413 +01041413 +100b0fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00008fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00100fb7 +002f8f93 +01f383b3 +0070b023 +00002437 +38d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00008fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +003f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00008fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +001f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +08000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00008fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +002f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +08000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00008fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +001f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0c000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00008fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +001f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +020f8f93 +01f40433 +0080b423 +0c000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00008fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +001f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0a000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00008fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +00000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00008fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +05000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +1a000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00020fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +09000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +10000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00020fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +4d000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0e000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00020fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00020fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +100003b7 +20038393 +01039393 +01039393 +00000fb7 +001f8f93 +01f383b3 +0070b023 +00002437 +98d40413 +01041413 +01041413 +10010fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00020fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +400013b7 +80038393 +01039393 +01039393 +00100fb7 +002f8f93 +01f383b3 +0070b023 +00001437 +c8d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00020fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +004003b7 +00038393 +01039393 +01039393 +00200fb7 +003f8f93 +01f383b3 +0070b023 +00003437 +78d40413 +01041413 +01041413 +10010fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00020fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +00000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00020fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +09000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +1a000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00028fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +09000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +10000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00028fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +4d000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0e000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00028fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00028fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +001f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00028fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +101003b7 +20038393 +01039393 +01039393 +00000fb7 +002f8f93 +01f383b3 +0070b023 +00003437 +e8d40413 +01041413 +01041413 +10010fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00028fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +004003b7 +00038393 +01039393 +01039393 +00100fb7 +003f8f93 +01f383b3 +0070b023 +00001437 +b8d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00028fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +00000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00028fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +05000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +1a000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00040fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +01000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +1a000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00040fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +09000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +10000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00040fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +4d000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0e000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00040fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +144003b7 +20038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00002437 +08d40413 +01041413 +01041413 +10040fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00040fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +400013b7 +80038393 +01039393 +01039393 +00100fb7 +001f8f93 +01f383b3 +0070b023 +00002437 +98d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00040fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +004003b7 +00038393 +01039393 +01039393 +00200fb7 +002f8f93 +01f383b3 +0070b023 +00001437 +c0040413 +01041413 +01041413 +20000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00040fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +003f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00040fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +030f8f93 +01f40433 +0080b423 +0c000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00040fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +00000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00040fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +1a000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00048fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +09000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +10000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00048fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +4d000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0e000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00048fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00048fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +404013b7 +80038393 +01039393 +01039393 +00000fb7 +001f8f93 +01f383b3 +0070b023 +00002437 +98d40413 +01041413 +01041413 +10030fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00048fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +002f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00048fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +010003b7 +00038393 +01039393 +01039393 +00200fb7 +003f8f93 +01f383b3 +0070b023 +00001437 +00140413 +01041413 +01041413 +a0020fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00048fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +00000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00048fb7 +000f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +07000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +1a000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00001fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +09000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +10000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00001fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +4d000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0e000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00001fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +140003b7 +20038393 +01039393 +01039393 +00200fb7 +000f8f93 +01f383b3 +0070b023 +00005437 +e8d40413 +01041413 +01041413 +10010fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00001fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +400013b7 +80038393 +01039393 +01039393 +00100fb7 +001f8f93 +01f383b3 +0070b023 +00002437 +08d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00001fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +002f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00001fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +003f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00001fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +08000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00001fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0c000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00001fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0a000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00001fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +00000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00001fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +09000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +10000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00009fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +4d000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0e000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00009fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00009fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +100003b7 +20038393 +01039393 +01039393 +00000fb7 +001f8f93 +01f383b3 +0070b023 +00001437 +08d40413 +01041413 +01041413 +100b0fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00009fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00100fb7 +002f8f93 +01f383b3 +0070b023 +00002437 +38d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00009fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +003f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00009fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +001f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +08000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00009fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +002f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +08000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00009fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +001f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0c000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00009fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +001f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +020f8f93 +01f40433 +0080b423 +0c000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00009fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +001f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0a000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00009fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +00000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00009fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +05000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +1a000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00021fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +09000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +10000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00021fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +4d000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0e000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00021fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00021fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +100003b7 +20038393 +01039393 +01039393 +00000fb7 +001f8f93 +01f383b3 +0070b023 +00002437 +98d40413 +01041413 +01041413 +10010fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00021fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +400013b7 +80038393 +01039393 +01039393 +00100fb7 +002f8f93 +01f383b3 +0070b023 +00001437 +c8d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00021fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +004003b7 +00038393 +01039393 +01039393 +00200fb7 +003f8f93 +01f383b3 +0070b023 +00003437 +78d40413 +01041413 +01041413 +10010fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00021fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +00000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00021fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +09000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +1a000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00029fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +09000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +10000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00029fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +4d000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0e000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00029fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00029fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +001f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00029fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +101003b7 +20038393 +01039393 +01039393 +00000fb7 +002f8f93 +01f383b3 +0070b023 +00003437 +e8d40413 +01041413 +01041413 +10010fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00029fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +004003b7 +00038393 +01039393 +01039393 +00100fb7 +003f8f93 +01f383b3 +0070b023 +00001437 +b8d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00029fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +00000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00029fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +05000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +1a000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00041fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +01000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +1a000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00041fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +09000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +10000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00041fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +4d000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0e000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00041fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +144003b7 +20038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00002437 +08d40413 +01041413 +01041413 +10040fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00041fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +400013b7 +80038393 +01039393 +01039393 +00100fb7 +001f8f93 +01f383b3 +0070b023 +00002437 +98d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00041fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +004003b7 +00038393 +01039393 +01039393 +00200fb7 +002f8f93 +01f383b3 +0070b023 +00001437 +c0040413 +01041413 +01041413 +20000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00041fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +003f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00041fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +030f8f93 +01f40433 +0080b423 +0c000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00041fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +00000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00041fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +03000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +1a000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00049fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +09000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +10000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00049fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +4d000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +0e000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00049fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00049fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +404013b7 +80038393 +01039393 +01039393 +00000fb7 +001f8f93 +01f383b3 +0070b023 +00002437 +98d40413 +01041413 +01041413 +10030fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00049fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +002f8f93 +01f383b3 +0070b023 +00000437 +18d40413 +01041413 +01041413 +10000fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00049fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +010003b7 +00038393 +01039393 +01039393 +00200fb7 +003f8f93 +01f383b3 +0070b023 +00001437 +00140413 +01041413 +01041413 +a0020fb7 +000f8f93 +01f40433 +0080b423 +06000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00049fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000003b7 +00038393 +01039393 +01039393 +00000fb7 +000f8f93 +01f383b3 +0070b023 +00000437 +00040413 +01041413 +01041413 +00000fb7 +000f8f93 +01f40433 +0080b423 +00000537 +00050513 +01051513 +01051513 +00000fb7 +000f8f93 +01f50533 +00a0b823 +000005b7 +00058593 +01059593 +01059593 +00049fb7 +900f8f93 +01f585b3 +00b0bc23 +02008093 +000010b7 +0012b423 +0022b823 +0032bc23 +00200193 +0032be23 +00300313 +00a00413 +0062b023 +0202b383 +00a3f393 +fe839ce3 +0000006f + From 269af120d4b20a214875e650db18b065e55a44ae Mon Sep 17 00:00:00 2001 From: Ron Jokai Date: Fri, 9 Jan 2026 23:24:23 -0600 Subject: [PATCH 3/7] [Copy-edit] Typo fix. --- src/axis_dma_duplex.sv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/axis_dma_duplex.sv b/src/axis_dma_duplex.sv index 207f01d..de95949 100644 --- a/src/axis_dma_duplex.sv +++ b/src/axis_dma_duplex.sv @@ -153,7 +153,7 @@ module axis_dma_duplex #( // Present packet to AXIS sink (CGRA) when a full packet is buffered assign s_axis_tdata[(BEATS_PER_PKT-1)*AXI_DATA_W +: AXI_DATA_W] = axi_i.r.data; //assign s_axis_tdata[0 +: (BEATS_PER_PKT-1)*AXI_DATA_W] = rx_shift[0 +: (BEATS_PER_PKT-1)*AXI_DATA_W]; - //assign s_axis_tdata = axi_i.r.data; TODO resilient fix for singe beat per packet. + //assign s_axis_tdata = axi_i.r.data; TODO resilient fix for single beat per packet. genvar i; generate From 930154dbe1e0868ee8fa30ce31d9108b7cfee4df Mon Sep 17 00:00:00 2001 From: Ron Jokai Date: Fri, 9 Jan 2026 23:26:23 -0600 Subject: [PATCH 4/7] [Code org] Changes needed to run tests from dedicated dir to avoid cluttering repo root. --- src/imem_rom.sv | 2 +- verif/acc_soc_tb.sv | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/imem_rom.sv b/src/imem_rom.sv index b787758..0578ed7 100644 --- a/src/imem_rom.sv +++ b/src/imem_rom.sv @@ -7,7 +7,7 @@ module imem_rom #(parameter int DEPTH = 4096) ( ); logic [31:0] mem [0:DEPTH-1]; //initial for (int i=0;i Date: Fri, 9 Jan 2026 23:27:52 -0600 Subject: [PATCH 5/7] [FIR vector] Add vector-FIR-specific versions of RTL and verif directories. --- src_fir_vector/acc_soc.sv | 315 +++++++++++++++++++++++++++++ src_fir_vector/axis_dma_duplex.sv | 284 ++++++++++++++++++++++++++ src_fir_vector/cgra_axis_bridge.sv | 118 +++++++++++ src_fir_vector/dp_sram_axi_cpu.sv | 74 +++++++ src_fir_vector/imem_rom.sv | 13 ++ verif_fir_vector/acc_soc_tb.sv | 179 ++++++++++++++++ 6 files changed, 983 insertions(+) create mode 100644 src_fir_vector/acc_soc.sv create mode 100644 src_fir_vector/axis_dma_duplex.sv create mode 100644 src_fir_vector/cgra_axis_bridge.sv create mode 100644 src_fir_vector/dp_sram_axi_cpu.sv create mode 100644 src_fir_vector/imem_rom.sv create mode 100644 verif_fir_vector/acc_soc_tb.sv diff --git a/src_fir_vector/acc_soc.sv b/src_fir_vector/acc_soc.sv new file mode 100644 index 0000000..f09912a --- /dev/null +++ b/src_fir_vector/acc_soc.sv @@ -0,0 +1,315 @@ +// ============================================================================ +// SoC (w/ PULP AXI) - BIDIRECTIONAL CGRA-to-Memory streaming. +// - CPU (riscV): simple DMEM/IMEM ports. +// - Shared RAM via PULP axi_to_mem -> dual-port SRAM (CPU simple + AXI). +// - CGRA packet bridge (AXIS_W=192) to MeshMultiCgra wrapper. +// - Duplex DMA: +// * RX engine: Memory -> AXIS (-> CGRA recv_from_cpu). +// * TX engine: AXIS (<- CGRA send_to_cpu) -> Memory. +// Uses AXI bursts (3 beats / 24B per packet) on a 64-bit AXI bus. +// - CPU MMIO @ 0x4000_0000 controls DMA (start/src/dst/len, status). +// ============================================================================ +`timescale 1ns/1ps + + +// ---------- Bit widths ---------- +localparam int CGRA_DATA_W = 64+1+1+1; // 67 +localparam int CGRA_CTRL_W = 7 + 4*3 + 8*3 + 8*2 + 3 + 1 + 4*2 + 4*4 + 4*1 + 4*4; // 107 +localparam int MCGR_PAY_W = 5 + CGRA_DATA_W + 7 + CGRA_CTRL_W + 4; // 158 +localparam int PKT_HDR_W = 5+5+2+2+1+1+1+1+8+1; // 27 +localparam int CGRA_PKT_W = PKT_HDR_W + MCGR_PAY_W; // 217 + +localparam int BEATS_PER_PKT = (CGRA_PKT_W + AXI_DATA_W - 1) / AXI_DATA_W; + + +function automatic logic [CGRA_PKT_W-1:0] pack_pkt (IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 p); + pack_pkt = { + // Header (MSB->LSB order) + p.src, + p.dst, + p.src_cgra_id, + p.dst_cgra_id, + p.src_cgra_x, + p.src_cgra_y, + p.dst_cgra_x, + p.dst_cgra_y, + p.opaque, + p.vc_id, + // Payload + p.payload.cmd, + p.payload.data.payload, + p.payload.data.predicate, + p.payload.data.bypass, + p.payload.data.delay, + p.payload.data_addr, + p.payload.ctrl.operation, + p.payload.ctrl.fu_in, + p.payload.ctrl.routing_xbar_outport, + p.payload.ctrl.fu_xbar_outport, + p.payload.ctrl.vector_factor_power, + p.payload.ctrl.is_last_ctrl, + p.payload.ctrl.write_reg_from, + p.payload.ctrl.write_reg_idx, + p.payload.ctrl.read_reg_from, + p.payload.ctrl.read_reg_idx, + p.payload.ctrl_addr + }; +endfunction + +function automatic IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 unpack_pkt (logic [CGRA_PKT_W-1:0] v); + IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 p; + // Use a running index from LSB upward for clarity + int i = 0; + // ctrl_addr (4) + p.payload.ctrl_addr = v[i +: 4]; i += 4; + // ctrl (107) + p.payload.ctrl.read_reg_idx = v[i +: 16]; i += 16; + p.payload.ctrl.read_reg_from = v[i +: 4]; i += 4; + p.payload.ctrl.write_reg_idx = v[i +: 16]; i += 16; + p.payload.ctrl.write_reg_from = v[i +: 8]; i += 8; + p.payload.ctrl.is_last_ctrl = v[i +: 1]; i += 1; + p.payload.ctrl.vector_factor_power = v[i +: 3]; i += 3; + p.payload.ctrl.fu_xbar_outport = v[i +: 16]; i += 16; // 8*2 + p.payload.ctrl.routing_xbar_outport = v[i +: 24]; i += 24; // 8*3 + p.payload.ctrl.fu_in = v[i +: 12]; i += 12; // 4*3 + p.payload.ctrl.operation = v[i +: 7]; i += 7; + // data_addr (7) + p.payload.data_addr = v[i +: 7]; i += 7; + // data (35) + p.payload.data.delay = v[i +: 1]; i += 1; + p.payload.data.bypass = v[i +: 1]; i += 1; + p.payload.data.predicate = v[i +: 1]; i += 1; + p.payload.data.payload = v[i +: 64]; i += 64; + // cmd (5) + p.payload.cmd = v[i +: 5]; i += 5; + // header tail (27) + p.vc_id = v[i +: 1]; i += 1; + p.opaque = v[i +: 8]; i += 8; + p.dst_cgra_y = v[i +: 1]; i += 1; + p.dst_cgra_x = v[i +: 1]; i += 1; + p.src_cgra_y = v[i +: 1]; i += 1; + p.src_cgra_x = v[i +: 1]; i += 1; + p.dst_cgra_id = v[i +: 2]; i += 2; + p.src_cgra_id = v[i +: 2]; i += 2; + p.dst = v[i +: 5]; i += 5; + p.src = v[i +: 5]; i += 5; + + // Consistency check. + if (i != CGRA_PKT_W) + $error("unpack index mismatch: %0d != %0d", i, CGRA_PKT_W); + + return p; +endfunction + + +// ----------------------------------------------------------------------------- +// DUT: SoC with MMIO @ 0x4000_0000 controlling the duplex DMA. +// ----------------------------------------------------------------------------- +module acc_soc ( + input logic clk, + input logic rstn +); + // ---------------- CPU instance ---------------- + logic [31:0] inst; + logic [63:0] PC_IMEM; + logic [63:0] readData_DMEM, addrData_DMEM, wrData_DMEM; + logic MemWrite_DMEM, MemRead_DMEM; + logic signed [63:0] readData1_RF, readData2_RF; // Driven by RF. + logic [4:0] readAddr1_RF, readAddr2_RF, writeAddr_RF; + logic [63:0] writeData_RF; + logic RegWrite_RF; + + // CPU Imem ROM + imem_rom u_imem( .pc(PC_IMEM[31:0]), .inst(inst) ); + + // Register-file + logic [63:0] rf [0:31]; + // Drive reads combinationally + assign readData1_RF = (readAddr1_RF == 0) ? 64'd0 : rf[readAddr1_RF]; + assign readData2_RF = (readAddr2_RF == 0) ? 64'd0 : rf[readAddr2_RF]; + // Capture writes + always_ff @(posedge clk) begin + if (RegWrite_RF && (writeAddr_RF != 0)) + rf[writeAddr_RF] <= writeData_RF; + end + + // CPU + riscV u_cpu( + .inst(inst), .PC_IMEM(PC_IMEM), + .readData_DMEM(readData_DMEM), .addrData_DMEM(addrData_DMEM), .wrData_DMEM(wrData_DMEM), + .MemWrite_DMEM(MemWrite_DMEM), .MemRead_DMEM(MemRead_DMEM), + .readData1_RF(readData1_RF), .readData2_RF(readData2_RF), + .readAddr1_RF(readAddr1_RF), .readAddr2_RF(readAddr2_RF), + .writeData_RF(writeData_RF), .writeAddr_RF(writeAddr_RF), .RegWrite_RF(RegWrite_RF), + .clk(clk), .rst(rstn) + ); + + // ---------------- MMIO registers ---------------- + localparam logic [63:0] MMIO_BASE = 64'h0000_0000_4000_0000; + localparam logic [63:0] MMIO_MASK = 64'hFFFF_FFFF_FFFF_F000; // 4KB window + logic is_mmio; + assign is_mmio = (addrData_DMEM & MMIO_MASK) == (MMIO_BASE & MMIO_MASK); + + // Simple MMIO register map (all 64b unless noted): + // 0x00 CONTROL [0]=start_rx, [1]=start_tx, [8]=irq_en (optional) + // 0x08 SRC_RX 64b byte addr (memory->CGRA) + // 0x10 DST_TX 64b byte addr (CGRA->memory) + // 0x18 LEN_RX 32b packet count + // 0x1C LEN_TX 32b packet count + // 0x20 STATUS [0]=busy_rx, [1]=done_rx, [2]=busy_tx, [3]=done_tx + logic reg_start_rx, reg_start_tx, reg_irq_en; + logic [63:0] reg_src_rx, reg_dst_tx; + logic [31:0] reg_len_rx, reg_len_tx; + logic stat_busy_rx, stat_done_rx, stat_busy_tx, stat_done_tx; + + // Write + always_ff @(posedge clk or negedge rstn) begin + if (!rstn) begin + reg_start_rx<=0; reg_start_tx<=0; reg_irq_en<=0; reg_src_rx<='0; reg_dst_tx<='0; reg_len_rx<='0; reg_len_tx<='0; + end else if (MemWrite_DMEM && is_mmio) begin + unique case (addrData_DMEM[7:0]) + 8'h00: begin reg_start_rx <= wrData_DMEM[0]; reg_start_tx <= wrData_DMEM[1]; reg_irq_en <= wrData_DMEM[8]; end + 8'h08: reg_src_rx <= wrData_DMEM; + 8'h10: reg_dst_tx <= wrData_DMEM; + 8'h18: reg_len_rx <= wrData_DMEM[31:0]; + 8'h1C: reg_len_tx <= wrData_DMEM[31:0]; + default: ; + endcase + end else begin + // auto-clear start strobes once DMA observes them (one-shot) + if (reg_start_rx && stat_busy_rx) reg_start_rx <= 1'b0; + if (reg_start_tx && stat_busy_tx) reg_start_tx <= 1'b0; + end + end + + // Read + logic [63:0] mmio_rdata; + always_comb begin + unique case (addrData_DMEM[7:0]) + 8'h00: mmio_rdata = {55'b0, reg_irq_en, 6'b0, reg_start_tx, reg_start_rx}; + 8'h08: mmio_rdata = reg_src_rx; + 8'h10: mmio_rdata = reg_dst_tx; + 8'h18: mmio_rdata = {32'b0, reg_len_rx}; + 8'h1C: mmio_rdata = {32'b0, reg_len_tx}; + 8'h20: mmio_rdata = {60'b0, stat_done_tx, stat_busy_tx, stat_done_rx, stat_busy_rx}; + default: mmio_rdata = 64'b0; + endcase + end + + // Return path to CPU DMEM + logic [63:0] ram_rdata; + assign readData_DMEM = is_mmio ? mmio_rdata : ram_rdata; + + // ---------------- Dual-ported SRAM ---------------- + logic mem_req, mem_gnt, mem_we, mem_rvalid; + logic [31:0] mem_addr; + logic [63:0] mem_wdata, mem_rdata; + logic [7:0] mem_strb; + + dp_sram_axi_cpu u_sram ( + .clk(clk), .rstn(rstn), + // CPU simple port (DMEM) + .cpu_addr (addrData_DMEM), + .cpu_wdata(wrData_DMEM), + .cpu_we (MemWrite_DMEM & ~is_mmio), + .cpu_rdata(ram_rdata), + // AXI side + .mem_req (mem_req), + .mem_gnt (mem_gnt), + .mem_addr (mem_addr), + .mem_wdata(mem_wdata), + .mem_strb (mem_strb), + .mem_we (mem_we), + .mem_rvalid(mem_rvalid), + .mem_rdata(mem_rdata) + ); + + // ---------------- PULP IP ---------------- + axi_req_t dma_axi_req; + axi_resp_t dma_axi_rsp; + + axi_to_mem #( + .axi_req_t (axi_req_t), + .axi_resp_t(axi_resp_t), + .AddrWidth (AXI_ADDR_W), + .DataWidth (AXI_DATA_W), + .IdWidth (AXI_ID_W), + .NumBanks (1), // single bank -> simple SRAM + .BufDepth (BEATS_PER_PKT) + ) u_axi2mem ( + .clk_i (clk), + .rst_ni (rstn), + .busy_o (), + .axi_req_i (dma_axi_req), + .axi_resp_o (dma_axi_rsp), + .mem_req_o (mem_req), + .mem_gnt_i (mem_gnt), + .mem_addr_o (mem_addr), + .mem_wdata_o(mem_wdata), + .mem_strb_o (mem_strb), + .mem_atop_o (), + .mem_we_o (mem_we), + .mem_rvalid_i(mem_rvalid), + .mem_rdata_i(mem_rdata) + ); + + // ---------------- Duplex DMA instance ---------------- + localparam int AXIS_W = AXI_DATA_W * ( (CGRA_PKT_W + AXI_DATA_W - 1) / AXI_DATA_W ) ; // 185 bits payload + 7 pad to get to a multiple of 64 + logic [AXIS_W-1:0] to_cgra_tdata; + logic to_cgra_tvalid, to_cgra_tready; + logic [AXIS_W-1:0] from_cgra_tdata; + logic from_cgra_tvalid, from_cgra_tready; + + axis_dma_duplex #( + .AXI_ADDR_W(AXI_ADDR_W), .AXI_DATA_W(AXI_DATA_W), .AXI_ID_W(AXI_ID_W), .AXIS_W(AXIS_W), .BEATS_PER_PKT(BEATS_PER_PKT) + ) u_dma ( + .clk(clk), .rstn(rstn), + .start_rx (reg_start_rx), + .src_addr_rx (reg_src_rx), + .len_pkts_rx (reg_len_rx), + .busy_rx (stat_busy_rx), + .done_rx (stat_done_rx), + .start_tx (reg_start_tx), + .dst_addr_tx (reg_dst_tx), + .len_pkts_tx (reg_len_tx), + .busy_tx (stat_busy_tx), + .done_tx (stat_done_tx), + .axi_i (dma_axi_rsp), + .axi_o (dma_axi_req), + .s_axis_tdata (to_cgra_tdata), + .s_axis_tvalid(to_cgra_tvalid), + .s_axis_tready(to_cgra_tready), + .m_axis_tdata (from_cgra_tdata), + .m_axis_tvalid(from_cgra_tvalid), + .m_axis_tready(from_cgra_tready) + ); + + // ---------------- CGRA bridge (packet pack/unpack) ---------------- + // Import packet types and declare bridge<->CGRA wires + //import cgra_pkt_pkg::*; + IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 recv_msg, send_msg; + logic [0:0] recv_val, recv_rdy; + logic [0:0] send_val, send_rdy; + + // Bridge between AXIS and CGRA packet ports + cgra_axis_bridge #(.AXIS_W(AXIS_W), .CGRA_PKT_W(CGRA_PKT_W)) u_cgra_bridge ( + .clk(clk), .rstn(rstn), + .s_axis_tdata (to_cgra_tdata), .s_axis_tvalid(to_cgra_tvalid), .s_axis_tready(to_cgra_tready), + .m_axis_tdata (from_cgra_tdata), .m_axis_tvalid(from_cgra_tvalid), .m_axis_tready(from_cgra_tready), + .recv_from_cpu_pkt__msg(recv_msg), .recv_from_cpu_pkt__rdy(recv_rdy), .recv_from_cpu_pkt__val(recv_val), + .send_to_cpu_pkt__msg (send_msg), .send_to_cpu_pkt__rdy (send_rdy), .send_to_cpu_pkt__val (send_val) + ); + + // ---------------- CGRA instance wired to the bridge ---------------- + MeshMultiCgraRTL__explicit_vector_global_reduce u_cgra ( + .clk (clk), + .reset (~rstn), + .recv_from_cpu_pkt__msg (recv_msg), + .recv_from_cpu_pkt__rdy (recv_rdy), + .recv_from_cpu_pkt__val (recv_val), + .send_to_cpu_pkt__msg (send_msg), + .send_to_cpu_pkt__rdy (send_rdy), + .send_to_cpu_pkt__val (send_val) + ); +endmodule + diff --git a/src_fir_vector/axis_dma_duplex.sv b/src_fir_vector/axis_dma_duplex.sv new file mode 100644 index 0000000..be26e6d --- /dev/null +++ b/src_fir_vector/axis_dma_duplex.sv @@ -0,0 +1,284 @@ +// ----------------------------------------------------------------------------- +// Duplex AXI-stream DMA (192b packet = 3×64b beats) with AXI bursts +// Control via simple wires (connected to MMIO regs in top) +// ----------------------------------------------------------------------------- +`include "axi/typedef.svh" +`include "axi/assign.svh" +import axi_pkg::*; + +// ---------------- PULP AXI types ---------------- +localparam int AXI_ADDR_W = 32; +localparam int AXI_DATA_W = 64; +localparam int AXI_ID_W = 4; +localparam int AXI_USER_W = 1; + +`AXI_TYPEDEF_ALL(axi, + logic [AXI_ADDR_W-1:0], // __addr_t + logic [AXI_ID_W-1:0], // __id_t + logic [AXI_DATA_W-1:0], // __data_t + logic [(AXI_DATA_W/8)-1:0], // __strb_t + logic [AXI_USER_W-1:0] // __user_t +) + + +module axis_dma_duplex #( + parameter int AXI_ADDR_W = 32, + parameter int AXI_DATA_W = 64, + parameter int AXI_ID_W = 4, + parameter int AXIS_W = 192, + parameter int BEATS_PER_PKT = (AXIS_W+AXI_DATA_W-1)/AXI_DATA_W // 192/64=3 +)( + input logic clk, + input logic rstn, + + // Control/Status + input logic start_rx, // Memory->CGRA + input logic [63:0] src_addr_rx, + input logic [31:0] len_pkts_rx, // number of 192b packets + output logic busy_rx, + output logic done_rx, + + input logic start_tx, // CGRA->Memory + input logic [63:0] dst_addr_tx, + input logic [31:0] len_pkts_tx, + output logic busy_tx, + output logic done_tx, + + // AXI Master (PULP typed) + input axi_resp_t axi_i, + output axi_req_t axi_o, + + // AXIS toward CGRA (ingress to CGRA) + output logic [AXIS_W-1:0] s_axis_tdata, + output logic s_axis_tvalid, + input logic s_axis_tready, + + // AXIS from CGRA (egress from CGRA) + input logic [AXIS_W-1:0] m_axis_tdata, + input logic m_axis_tvalid, + output logic m_axis_tready +); + + // --------------------------------------------------------------------------- + // AXI req defaulting + // --------------------------------------------------------------------------- + axi_req_t req_d, req_q; + assign axi_o = req_q; + always_comb begin + req_d = '0; + // defaults + req_d.aw_valid = 1'b0; req_d.aw.id = '0; req_d.aw.len = BEATS_PER_PKT-1; req_d.aw.size = $clog2(AXI_DATA_W/8); req_d.aw.burst = BURST_INCR; + req_d.w_valid = 1'b0; req_d.w.strb = '1; req_d.w.last = 1'b0; + req_d.b_ready = 1'b1; + req_d.ar_valid = 1'b0; req_d.ar.id = '0; req_d.ar.len = BEATS_PER_PKT-1; req_d.ar.size = $clog2(AXI_DATA_W/8); req_d.ar.burst = BURST_INCR; + req_d.r_ready = 1'b1; + end + + // --------------------------------------------------------------------------- + // RX engine: Memory -> AXIS + // --------------------------------------------------------------------------- + typedef enum logic [1:0] {RX_IDLE, RX_AR, RX_R, RX_DONE} rx_state_e; + rx_state_e rx_st; logic [31:0] rx_pkts_left; logic [AXI_ADDR_W-1:0] rx_addr; + logic [2:0] rx_beat_cnt; logic [AXIS_W-1:0] rx_shift; + + assign busy_rx = (rx_st != RX_IDLE) && (rx_st != RX_DONE); + //assign done_rx = (rx_st == RX_DONE); + logic done_rx_nxt; + assign done_rx_nxt = start_rx ? 'b0 : ( (rx_st == RX_DONE) ? 'b1 : done_rx ); + always_ff @(posedge clk or negedge rstn) begin + if (!rstn) + done_rx <= 'b0; + else + done_rx <= done_rx_nxt; + end + + always_ff @(posedge clk or negedge rstn) begin + if (!rstn) begin + rx_st <= RX_IDLE; rx_pkts_left <= '0; rx_addr <= '0; rx_beat_cnt <= '0; rx_shift <= '0; + req_q.ar_valid <= '0; + req_q.ar <= '0; + req_q.r_ready <= '0; + end else begin + unique case (rx_st) + RX_IDLE: if (start_rx) begin + rx_pkts_left <= len_pkts_rx; + rx_addr <= src_addr_rx[AXI_ADDR_W-1:0]; + rx_st <= RX_AR; + req_q.r_ready <= 1'b0; + req_q.ar_valid <= 1'b1; req_q.ar.addr <= src_addr_rx[AXI_ADDR_W-1:0]; req_q.ar.len <= BEATS_PER_PKT-1; req_q.ar.burst <= 'd1; req_q.ar.size <= $clog2(AXI_DATA_W/8); + end + RX_AR: begin + // drive AR until accepted + req_q.ar_valid <= 1'b1; req_q.ar.addr <= rx_addr; req_q.ar.len <= BEATS_PER_PKT-1; req_q.ar.burst <= 'd1; req_q.ar.size <= $clog2(AXI_DATA_W/8); + if (axi_i.ar_ready) begin + req_q.ar_valid <= 1'b0; + rx_beat_cnt <= '0; + rx_st <= RX_R; + req_q.r_ready <= 1'b1; + end + end + RX_R: begin + // Assemble BEATS_PER_PKT beats into rx_shift[AXIS_W-1:0] + if (axi_i.r_valid) begin + // place each 64-bit beat into increasing chunks [63:0], [127:64], [191:128] + rx_shift[rx_beat_cnt*AXI_DATA_W +: AXI_DATA_W] <= axi_i.r.data; + if (rx_beat_cnt == BEATS_PER_PKT-1) begin + // Have a full packet; offer to AXIS sink + if (s_axis_tready) begin + // Commit packet + rx_beat_cnt <= '0; + // Next packet + if (rx_pkts_left > 1) begin + rx_pkts_left <= rx_pkts_left - 1; + rx_addr <= rx_addr + BEATS_PER_PKT*(AXI_DATA_W/8); + rx_st <= RX_AR; + req_q.r_ready <= 1'b0; + req_q.ar_valid <= 1'b1; req_q.ar.addr <= rx_addr + BEATS_PER_PKT*(AXI_DATA_W/8); req_q.ar.len <= BEATS_PER_PKT-1; req_q.ar.burst <= 'd1; req_q.ar.size <= $clog2(AXI_DATA_W/8); + end else begin + rx_st <= RX_DONE; + req_q.r_ready <= 1'b0; + end + end + end else begin + rx_beat_cnt <= rx_beat_cnt + 1'b1; + end + end + end + RX_DONE: rx_st <= RX_IDLE; + default: rx_st <= RX_IDLE; + endcase + end + end + + // Present packet to AXIS sink (CGRA) when a full packet is buffered + assign s_axis_tdata[(BEATS_PER_PKT-1)*AXI_DATA_W +: AXI_DATA_W] = axi_i.r.data; + //assign s_axis_tdata[0 +: (BEATS_PER_PKT-1)*AXI_DATA_W] = rx_shift[0 +: (BEATS_PER_PKT-1)*AXI_DATA_W]; + //assign s_axis_tdata = axi_i.r.data; TODO resilient fix for single beat per packet. + genvar i; + + generate + for (i = 0; i < (BEATS_PER_PKT-1); i = i + 1) begin : beat_i + assign s_axis_tdata[i*AXI_DATA_W +: AXI_DATA_W] = rx_shift[i*AXI_DATA_W +: AXI_DATA_W]; + end + endgenerate + + assign s_axis_tvalid = (rx_st == RX_R) && (rx_beat_cnt == BEATS_PER_PKT-1) && axi_i.r_valid; + + // --------------------------------------------------------------------------- + // TX engine: AXIS -> Memory + // --------------------------------------------------------------------------- + typedef enum logic [2:0] {TX_IDLE, TX_CAPTURE, TX_AW, TX_W, TX_B, TX_DONE} tx_state_e; + tx_state_e tx_st; logic [31:0] tx_pkts_left; logic [AXI_ADDR_W-1:0] tx_addr; + logic [1:0] tx_beat_cnt; logic [AXIS_W-1:0] tx_buf; + + assign busy_tx = (tx_st != TX_IDLE) && (tx_st != TX_DONE); + //assign done_tx = (tx_st == TX_DONE); + logic done_tx_nxt; + assign done_tx_nxt = start_tx ? 'b0 : ( (tx_st == TX_DONE) ? 'b1 : done_tx ); + always_ff @(posedge clk or negedge rstn) begin + if (!rstn) + done_tx <= 'b0; + else + done_tx <= done_tx_nxt; + end + + // Always ready to accept a packet when in CAPTURE + assign m_axis_tready = (tx_st == TX_CAPTURE); + + always_ff @(posedge clk or negedge rstn) begin + if (!rstn) begin + tx_st <= TX_IDLE; tx_pkts_left <= '0; tx_addr <= '0; tx_beat_cnt <= '0; tx_buf <= '0; + req_q.aw_valid <= 1'b0; + req_q.aw <= '0; + req_q.w <= '0; + req_q.w_valid <= 1'b0; + req_q.b_ready <= 1'b0; + end else begin + unique case (tx_st) + TX_IDLE: if (start_tx) begin + tx_pkts_left <= len_pkts_tx; + tx_addr <= dst_addr_tx[AXI_ADDR_W-1:0]; + tx_st <= TX_CAPTURE; + end + TX_CAPTURE: begin + if (m_axis_tvalid) begin + tx_buf <= m_axis_tdata; + tx_st <= TX_AW; + tx_beat_cnt <= '0; + //req_q.aw_valid <= 1'b1; req_q.aw.addr <= tx_addr; req_q.aw.len <= BEATS_PER_PKT-1; req_q.aw.burst <= 'd1; req_q.aw.size <= $clog2(AXI_DATA_W/8); + //req_q.w_valid <= 1'b1; req_q.w.data <= tx_buf[tx_beat_cnt*AXI_DATA_W +: AXI_DATA_W]; req_q.w.strb <= {8{1'b1}}; req_q.w.last <= (tx_beat_cnt == BEATS_PER_PKT-1); + end + end + TX_AW: begin + req_q.aw_valid <= 1'b1; req_q.aw.addr <= tx_addr; req_q.aw.len <= BEATS_PER_PKT-1; req_q.aw.burst <= 'd1; req_q.aw.size <= $clog2(AXI_DATA_W/8); + req_q.w_valid <= 1'b1; req_q.w.data <= tx_buf[tx_beat_cnt*AXI_DATA_W +: AXI_DATA_W]; req_q.w.strb <= {8{1'b1}}; req_q.w.last <= (tx_beat_cnt == BEATS_PER_PKT-1); + req_q.b_ready <= 1'b1; + if (axi_i.aw_ready && (tx_beat_cnt != BEATS_PER_PKT-1) ) begin // 1 != BEATS_PER_PKT + req_q.aw_valid <= 1'b0; + tx_beat_cnt <= 'b1; + tx_st <= TX_W; + req_q.w_valid <= 1'b1; req_q.w.data <= tx_buf[1*AXI_DATA_W +: AXI_DATA_W]; req_q.w.strb <= {8{1'b1}}; req_q.w.last <= (1 == BEATS_PER_PKT-1); + end else if (axi_i.aw_ready && (tx_beat_cnt == BEATS_PER_PKT-1) && ~axi_i.b_valid) begin // 1 == BEATS_PER_PKT + tx_st <= TX_B; + req_q.w_valid <= 1'b0; + req_q.aw_valid <= 1'b0; + end else if (axi_i.aw_ready && (tx_beat_cnt == BEATS_PER_PKT-1) && axi_i.b_valid) begin // 1 == BEATS_PER_PKT + //tx_st <= TX_DONE; + req_q.w_valid <= 1'b0; + req_q.aw_valid <= 1'b0; + if (tx_pkts_left > 1) begin + tx_pkts_left <= tx_pkts_left - 1; + tx_addr <= tx_addr + BEATS_PER_PKT*(AXI_DATA_W/8); + tx_st <= TX_CAPTURE; + end else begin + tx_st <= TX_DONE; + end + end + end + TX_W: begin + //req_q.aw_valid <= 1'b1; req_q.aw.addr <= tx_addr; req_q.aw.len <= BEATS_PER_PKT-1; req_q.aw.burst <= 'd1; req_q.aw.size <= $clog2(AXI_DATA_W/8); + // drive each 64-bit chunk sequentially + req_q.w_valid <= 1'b1; req_q.w.data <= tx_buf[tx_beat_cnt*AXI_DATA_W +: AXI_DATA_W]; req_q.w.strb <= {8{1'b1}}; req_q.w.last <= (tx_beat_cnt == BEATS_PER_PKT-1); + req_q.b_ready <= 1'b1; + if (axi_i.w_ready) begin + if ( (tx_beat_cnt == BEATS_PER_PKT-1) && ~axi_i.b_valid ) begin + req_q.b_ready <= 1'b1; + tx_st <= TX_B; + req_q.w_valid <= 1'b0; + end else if ( (tx_beat_cnt == BEATS_PER_PKT-1) && axi_i.b_valid ) begin + //req_q.b_ready <= 1'b1; + //tx_st <= TX_DONE; + req_q.w_valid <= 1'b0; + if (tx_pkts_left > 1) begin + tx_pkts_left <= tx_pkts_left - 1; + tx_addr <= tx_addr + BEATS_PER_PKT*(AXI_DATA_W/8); + tx_st <= TX_CAPTURE; + end else begin + tx_st <= TX_DONE; + end + end else begin + tx_beat_cnt <= tx_beat_cnt + 1'b1; + req_q.w_valid <= 1'b1; req_q.w.data <= tx_buf[(tx_beat_cnt+1'b1)*AXI_DATA_W +: AXI_DATA_W]; req_q.w.strb <= {8{1'b1}}; req_q.w.last <= ((tx_beat_cnt+1'b1) == BEATS_PER_PKT-1); + end + end + end + TX_B: begin + if (axi_i.b_valid) begin + // Next packet or done + req_q.b_ready <= 1'b0; + if (tx_pkts_left > 1) begin + tx_pkts_left <= tx_pkts_left - 1; + tx_addr <= tx_addr + BEATS_PER_PKT*(AXI_DATA_W/8); + tx_st <= TX_CAPTURE; + end else begin + tx_st <= TX_DONE; + end + end + end + TX_DONE: tx_st <= TX_IDLE; + default: tx_st <= TX_IDLE; + endcase + end + end +endmodule + diff --git a/src_fir_vector/cgra_axis_bridge.sv b/src_fir_vector/cgra_axis_bridge.sv new file mode 100644 index 0000000..b4af008 --- /dev/null +++ b/src_fir_vector/cgra_axis_bridge.sv @@ -0,0 +1,118 @@ +// ----------------------------------------------------------------------------- +// Import the CGRA packet bridge (pack/unpack) — assumed present in your tree +// package cgra_pkt_pkg +// module cgra_axis_bridge #(AXIS_W=192) +// ----------------------------------------------------------------------------- +// ============================================================ +// 1-beat AXI-Stream bridge to MeshMultiCgraRTL ports +// - s_axis_* : DMA -> CGRA (CPU->CGRA direction) +// - m_axis_* : CGRA -> DMA (CGRA->CPU direction) +// ============================================================ +module cgra_axis_bridge #( + parameter int AXIS_W = 192, // must be >= cgra_pkt_pkg::CGRA_PKT_W (185) + parameter int CGRA_PKT_W = 185 +)( + input logic clk, + input logic rstn, + + // ------------------ AXI-Stream to CGRA (ingress) ------------------ + input logic [AXIS_W-1:0] s_axis_tdata, + input logic s_axis_tvalid, + output logic s_axis_tready, + + // ------------------ AXI-Stream from CGRA (egress) ----------------- + output logic [AXIS_W-1:0] m_axis_tdata, + output logic m_axis_tvalid, + input logic m_axis_tready, + + // ------------------ CGRA ports ----------------------------- + output IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 recv_from_cpu_pkt__msg, + input logic [0:0] recv_from_cpu_pkt__rdy, + output logic [0:0] recv_from_cpu_pkt__val, + + input IntraCgraPacket_4_2x2_16_8_2_CgraPayload__d294fd7ecd3c5b69 send_to_cpu_pkt__msg, + output logic [0:0] send_to_cpu_pkt__rdy, + input logic [0:0] send_to_cpu_pkt__val +); + //import cgra_pkt_pkg::*; + // Pad/trim helpers + localparam int PKT_W = CGRA_PKT_W; // 185 + localparam int PAD_W = (AXIS_W >= PKT_W) ? (AXIS_W - PKT_W) : -1; + initial if (AXIS_W < PKT_W) $error("AXIS_W (%0d) < CGRA packet width (%0d)", AXIS_W, PKT_W); + + // ---------- Ingress: AXIS -> CGRA ---------- + // 1-beat transfer: when both s_axis_tvalid && recv_from_cpu_pkt__rdy. + assign s_axis_tready = recv_from_cpu_pkt__rdy; + assign recv_from_cpu_pkt__val = s_axis_tvalid; + assign recv_from_cpu_pkt__msg = unpack_pkt(s_axis_tdata[PKT_W-1:0]); + + assign send_to_cpu_pkt__rdy = m_axis_tready; + assign m_axis_tvalid = send_to_cpu_pkt__val; + assign m_axis_tdata[PKT_W-1:0] = pack_pkt(send_to_cpu_pkt__msg); + assign m_axis_tdata[AXIS_W-1:PKT_W] = '0; + + /* + // ============================================================================ + // Ingress path: AXIS -> (buffer) -> CGRA.recv_from_cpu_pkt + // ============================================================================ + // One-entry skid buffer to avoid combinational loops and ease timing + logic in_full; + logic [AXIS_W-1:0] in_data_q; + + // Accept from AXIS when buffer not full + assign s_axis_tready = ~in_full; + + // Buffer fill / drain + always_ff @(posedge clk or negedge rstn) begin + if (!rstn) begin + in_full <= 1'b0; + in_data_q <= '0; + end else begin + // Fill on handshake if empty + if (!in_full && s_axis_tvalid && s_axis_tready) begin + in_data_q <= s_axis_tdata; + in_full <= 1'b1; + end + // Drain to CGRA when it takes it + if (in_full && recv_from_cpu_pkt__rdy[0]) begin + in_full <= 1'b0; + end + end + end + + // Drive CGRA typed message/val from buffer + assign recv_from_cpu_pkt__val = in_full; + assign recv_from_cpu_pkt__msg = unpack_pkt(in_data_q[PKT_W-1:0]); + + // ============================================================================ + // Egress path: CGRA.send_to_cpu_pkt -> (buffer) -> AXIS + // ============================================================================ + logic out_full; + logic [AXIS_W-1:0] out_data_q; + + // Backpressure toward CGRA (ready only when buffer has space) + assign send_to_cpu_pkt__rdy = {~out_full}; + + // Capture from CGRA when it produces and buffer empty + always_ff @(posedge clk or negedge rstn) begin + if (!rstn) begin + out_full <= 1'b0; + out_data_q <= '0; + end else begin + if (!out_full && send_to_cpu_pkt__val[0] && send_to_cpu_pkt__rdy[0]) begin + out_data_q <= '0; + out_data_q[PKT_W-1:0] <= pack_pkt(send_to_cpu_pkt__msg); + out_full <= 1'b1; + end + // AXIS consumer handshake drains the buffer + if (out_full && m_axis_tready) begin + out_full <= 1'b0; + end + end + end + + assign m_axis_tvalid = out_full; + assign m_axis_tdata = out_data_q; + */ +endmodule + diff --git a/src_fir_vector/dp_sram_axi_cpu.sv b/src_fir_vector/dp_sram_axi_cpu.sv new file mode 100644 index 0000000..28b0b79 --- /dev/null +++ b/src_fir_vector/dp_sram_axi_cpu.sv @@ -0,0 +1,74 @@ +// ----------------------------------------------------------------------------- +// Utility: 64-bit wide, dual-ported SRAM (CPU simple + PULP mem_req*) +// ----------------------------------------------------------------------------- +module dp_sram_axi_cpu #( + parameter longint DEPTH_WORD = 1024 * 64 +)( + input logic clk, + input logic rstn, + // Port A: CPU simple (byte addr) + input logic [63:0] cpu_addr, + input logic [63:0] cpu_wdata, + input logic cpu_we, + output logic [63:0] cpu_rdata, + // Port B: PULP mem_req* (byte addr) + input logic mem_req, + output logic mem_gnt, + input logic [31:0] mem_addr, + input logic [63:0] mem_wdata, + input logic [7:0] mem_strb, + input logic mem_we, + output logic mem_rvalid, + output logic [63:0] mem_rdata +); + // Storage + logic [63:0] mem [0:DEPTH_WORD-1]; + + logic [63:0] cpu_addr_aligned; + logic [31:0] mem_addr_aligned; + assign cpu_addr_aligned = cpu_addr >> 3; + assign mem_addr_aligned = mem_addr >> 3; + + + // Static loop indices (avoid automatic loop vars) + int unsigned k_cpu_r, k_w, k_r; + + // ---------------- CPU read: purely combinational ---------------- + assign cpu_rdata = mem[cpu_addr_aligned]; + assign mem_rdata = mem[mem_addr_aligned]; + assign mem_rvalid = mem_req; //& ~mem_we; // rvalid is expected for both reads AND WRITES. Won't get bvalid out of axi_to_mem otherwise. + // TODO: mem_rvalid =? mem_req & ( ~mem_we | (mem_we & ~cpu_we) ) + assign mem_gnt = mem_req & ~cpu_we; + // TODO: what is mem_gnt really? "..., request can be granted by this bank"? + // ---------------- Unified writer + AXI read model ---------------- + // One always_ff drives: mem_gnt, mem_rvalid, mem_rdata, and *all* writes to mem + always_ff @(posedge clk or negedge rstn) begin + if (!rstn) begin; + //mem_gnt <= 1'b0; + //mem_rvalid <= 1'b0; + //mem_rdata <= '0; + end else begin + // Default handshakes + //mem_gnt <= mem_req & ~cpu_we; + //mem_rvalid <= mem_req & ~mem_we; + + // AXI read data (one-cycle model) + //if (mem_req && !mem_we) begin + // mem_rdata <= mem[mem_addr_aligned]; + //end + + // ---- Writes (two-writer block) ---- + // Priority: 1) CPU Port-A 2) AXI Port-B. + if (cpu_we) begin + mem[cpu_addr_aligned] <= cpu_wdata; + end + else if (mem_req && mem_we) begin + for (int b = 0; b < 8; b++) begin + mem[mem_addr_aligned][8*b +: 8] <= {8{mem_strb[b]}} & mem_wdata[8*b +: 8]; + end + end + end + end + +endmodule + diff --git a/src_fir_vector/imem_rom.sv b/src_fir_vector/imem_rom.sv new file mode 100644 index 0000000..5a06e1f --- /dev/null +++ b/src_fir_vector/imem_rom.sv @@ -0,0 +1,13 @@ +// ----------------------------------------------------------------------------- +// IMEM ROM (32b words, addressed by PC[31:2]) +// ----------------------------------------------------------------------------- +module imem_rom #(parameter int DEPTH = 4096) ( + input logic [31:0] pc, + output logic [31:0] inst +); + logic [31:0] mem [0:DEPTH-1]; + //initial for (int i=0;i> 3], + dut.u_sram.mem[(64'h2000 + i*32 + 8) >> 3], + dut.u_sram.mem[(64'h2000 + i*32 + 16) >> 3], + dut.u_sram.mem[(64'h2000 + i*32 + 24) >> 3]); + end + + $display("IMEM:"); + for (int b=0;b<30;b++) + $display("%02x", dut.u_imem.mem[b]); + + $display("RF:"); + for (int b=0;b<32;b++) + $display("%02x", dut.rf[b]); + + $display("\nTO CGRA"); + $display("SRAM[0x1000..0x1007]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_1000 >> 3]); + $display("SRAM[0x1008..0x100f]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_1008 >> 3]); + $display("SRAM[0x1010..0x1017]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_1010 >> 3]); + $display("SRAM[0x1018..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_1018 >> 3]); + + $display("SRAM[0x1020..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_1020 >> 3]); + $display("SRAM[0x1028..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_1028 >> 3]); + $display("SRAM[0x1030..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_1030 >> 3]); + $display("SRAM[0x1038..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_1038 >> 3]); + + $display("SRAM[0x1040..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_1040 >> 3]); + $display("SRAM[0x1048..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_1048 >> 3]); + $display("SRAM[0x1050..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_1050 >> 3]); + $display("SRAM[0x1058..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_1058 >> 3]); + + + $display("\nFROM CGRA"); + $display("SRAM[0x2000..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_2000 >> 3]); + $display("SRAM[0x2008..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_2008 >> 3]); + $display("SRAM[0x2010..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_2010 >> 3]); + $display("SRAM[0x2018..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_2018 >> 3]); + + $display("SRAM[0x2020..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_2020 >> 3]); + $display("SRAM[0x2028..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_2028 >> 3]); + $display("SRAM[0x2030..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_2030 >> 3]); + $display("SRAM[0x2038..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_2038 >> 3]); + + $display("SRAM[0x2040..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_2040 >> 3]); + $display("SRAM[0x2048..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_2048 >> 3]); + $display("SRAM[0x2050..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_2050 >> 3]); + $display("SRAM[0x2058..]:"); + $display("%02x", dut.u_sram.mem[64'h0000_0000_0000_2058 >> 3]); + + + $display("MMIO:"); + $display("%09b", {dut.reg_irq_en, 6'b0, dut.reg_start_tx, dut.reg_start_rx}); + $display("%02x %02x", dut.reg_src_rx, dut.reg_dst_tx); + $display("%02x %02x", dut.reg_len_rx, dut.reg_len_tx); + $display("%04b", {dut.stat_done_tx, dut.stat_busy_tx, dut.stat_done_rx, dut.stat_busy_rx}); + + + $finish(); + end + + initial + forever + begin + #5 + clk = ~clk; + end + + always @ (posedge clk or negedge clk) + begin + #1 + + if ( ( ('h0000000000100000 == dut.u_sram.mem[64'h0000_0000_0000_2000 >> 3]) && + ('h9700238d10000000 == dut.u_sram.mem[64'h0000_0000_0000_2008 >> 3]) && + ('h1c00000000000022 == dut.u_sram.mem[64'h0000_0000_0000_2010 >> 3]) && + ( 'h0180000 == dut.u_sram.mem[64'h0000_0000_0000_2018 >> 3]) ) && + ( ('h0000000000100000 == dut.u_sram.mem[64'h0000_0000_0000_2020 >> 3]) && + ('h9700238d10000000 == dut.u_sram.mem[64'h0000_0000_0000_2028 >> 3]) && + ('h1c00000000000022 == dut.u_sram.mem[64'h0000_0000_0000_2030 >> 3]) && + ( 'h0182400 == dut.u_sram.mem[64'h0000_0000_0000_2038 >> 3]) ) ) + begin + PASS = 1; + end + end + + /*initial + begin + $dumpfile("./output.vcd"); + $dumpvars (0, cgra_test); + end*/ +`ifndef VERILATOR + initial + begin + $fsdbDumpfile("./output.fsdb"); + //$fsdbDumpvars (0, "cgra_test.MultiCGRA.cgra__0.tile__5.send_data__msg"); + $fsdbDumpvars ("+all", "acc_soc_tb"); + $fsdbDumpMDA; + $fsdbDumpSVA; + end +`endif + + +endmodule + From b87589369c49869b1aed16f824595007e2316b2b Mon Sep 17 00:00:00 2001 From: Ron Jokai Date: Fri, 9 Jan 2026 23:36:20 -0600 Subject: [PATCH 6/7] [FIR-vector CI] Add RTL generation and Verilator test to CI. --- .github/workflows/ci-acc-soc.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-acc-soc.yml b/.github/workflows/ci-acc-soc.yml index 6a2f02d..2d19943 100644 --- a/.github/workflows/ci-acc-soc.yml +++ b/.github/workflows/ci-acc-soc.yml @@ -114,8 +114,10 @@ jobs: #pytest ../mem/data/test/DataMemControllerRTL_test.py -xvs --test-verilog --dump-vtb --dump-vcd ## MeshMultiCgraTemplateRTL Test #pytest ../multi_cgra/test/MeshMultiCgraTemplateRTL_test.py -xvs --test-verilog --dump-vtb --dump-vcd - # Generate .v file with explicit file & module names. + # Generate .v file with explicit file & module names for scalar FIR. pytest ../VectorCGRA/multi_cgra/test/MeshMultiCgraRTL_test.py::test_multi_CGRA_fir_scalar_translation -xvs --test-verilog --dump-vtb --dump-vcd + # Generate .v file with explicit file & module names for vector FIR. + pytest ../VectorCGRA/multi_cgra/test/MeshMultiCgraRTL_test.py::test_multi_CGRA_fir_vector_global_reduce_translation -xvs --test-verilog --dump-vtb --dump-vcd #- name: Test synthesis for CGRA template # run: | @@ -152,4 +154,6 @@ jobs: verilator --version verilator --binary -j 0 -Wno-UNOPTFLAT -Wno-WIDTHEXPAND -Wno-TIMESCALEMOD -Wno-WIDTHTRUNC --error-limit 1000 --trace --timing -I../common_cells/include -I../axi/include -I../erv_RISC-V --top acc_soc_tb ../erv_RISC-V/ALUCtrl.v ../erv_RISC-V/dff.v ../erv_RISC-V/immGen.v ../erv_RISC-V/mainCtrl.v ../erv_RISC-V/risc5ALU_core.v ../erv_RISC-V/riscV.v ../common_cells/src/stream_mux.sv ../common_cells/src/stream_fork.sv ../common_cells/src/stream_fifo.sv ../common_cells/src/stream_join.sv ../common_cells/src/stream_fork_dynamic.sv ../common_cells/src/fifo_v3.sv ../common_cells/src/stream_join_dynamic.sv ../axi/src/axi_pkg.sv ../axi/src/axi_intf.sv ../axi/src/axi_to_detailed_mem.sv ../axi/src/axi_to_mem.sv ./MeshMultiCgraRTL__explicit__pickled.v ../src/imem_rom.sv ../src/dp_sram_axi_cpu.sv ../src/cgra_axis_bridge.sv ../src/axis_dma_duplex.sv ../src/acc_soc.sv ../verif/acc_soc_tb.sv ./obj_dir/Vacc_soc_tb + verilator --binary -j 0 -Wno-UNOPTFLAT -Wno-WIDTHEXPAND -Wno-TIMESCALEMOD -Wno-WIDTHTRUNC --error-limit 1000 --trace --timing -I../common_cells/include -I../axi/include -I../erv_RISC-V --top acc_soc_tb ../erv_RISC-V/ALUCtrl.v ../erv_RISC-V/dff.v ../erv_RISC-V/immGen.v ../erv_RISC-V/mainCtrl.v ../erv_RISC-V/risc5ALU_core.v ../erv_RISC-V/riscV.v ../common_cells/src/stream_mux.sv ../common_cells/src/stream_fork.sv ../common_cells/src/stream_fifo.sv ../common_cells/src/stream_join.sv ../common_cells/src/stream_fork_dynamic.sv ../common_cells/src/fifo_v3.sv ../common_cells/src/stream_join_dynamic.sv ../axi/src/axi_pkg.sv ../axi/src/axi_intf.sv ../axi/src/axi_to_detailed_mem.sv ../axi/src/axi_to_mem.sv ./MeshMultiCgraRTL__explicit_vector_global_reduce__pickled.v ../src_fir_vector/imem_rom.sv ../src_fir_vector/dp_sram_axi_cpu.sv ../src_fir_vector/cgra_axis_bridge.sv ../src_fir_vector/axis_dma_duplex.sv ../src_fir_vector/acc_soc.sv ../verif_fir_vector/acc_soc_tb.sv + ./obj_dir/Vacc_soc_tb From 3e2d43aed8847db8e8342e5d3be090842ba71c13 Mon Sep 17 00:00:00 2001 From: Ron Jokai Date: Fri, 9 Jan 2026 23:49:52 -0600 Subject: [PATCH 7/7] [Submodule] Update submodule VectorCGRA to the latest version. --- VectorCGRA | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VectorCGRA b/VectorCGRA index 600caa6..2d40b3a 160000 --- a/VectorCGRA +++ b/VectorCGRA @@ -1 +1 @@ -Subproject commit 600caa6883c568820467e0548575edba5abadbf8 +Subproject commit 2d40b3acfe8d99209febcda7bf9488939e11cfa3